Spring + Hibernate = Неизвестная сущность - PullRequest
14 голосов
/ 01 ноября 2009

Я пытаюсь объединить Spring с Hibernate, используя аннотации, и получаю следующую ошибку:

org.springframework.orm.hibernate3.HibernateSystemException : Unknown entity: entities.Bar; nested exception is org.hibernate.MappingException: Unknown entity: entities.Bar

Вот мои настройки ...

Моя сущность:

package entities;

@Entity    
public class Bar implements Serializable
{
  ...
}

My Bean:

package blah;

@Repository
@Service("fooService")
@RemotingDestination(channels = { "my-amf" })
public class Foo
{
  protected HibernateTemplate template;

  @Autowired
  public void setSessionFactory(SessionFactory sessionFactory)
  {
    template = new HibernateTemplate(sessionFactory);
  }

  @RemotingInclude
  public void addBar(String name) throws DataAccessException
  {
    Bar bar = new Bar();
    bar.setName(name);
    template.save(bar);
  }

}

Я включаю аннотации весной:

<context:annotation-config />
<context:component-scan base-package="blah" />

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:~/blahdb/blahdb" />
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="annotatedClasses">
        <list>
            <value>entities.Bar</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>
</bean>

Я получаю сообщение об ошибке при вызове метода Foo.addBar из приложения Flex через BlazeDS.

Я бы действительно хотел избежать дополнительной настройки, и, похоже, все это должно работать.

Я использую Spring 3.0.0.RC1, Hibernate Annotations 3.4.0, Tomcat 6.0.20 и Java 1.6.0_15.

Есть идеи? Спасибо.

Ответы [ 6 ]

33 голосов
/ 04 ноября 2009

Попробуйте использовать import @javax.persistence.Entity, а не org.hibernate.annotations.Entity для аннотации Entity.

7 голосов
/ 27 сентября 2011

Я столкнулся с той же проблемой и не нашел хорошего ответа на этот вопрос

Для меня сработало объявление классов сущностей в файле persistence.xml

(как по ресурсам, так и по тесту):

<persistence ...>
    <persistence-unit ...>

        <class>com.company.maenad.core.model.News</class>
        <class>com.company.maenad.core.model.AdExtraInfo</class>

    </persistence-unit>
</persistence>
3 голосов
/ 01 августа 2013

Вышеупомянутое исключение также происходит, если свойство annotatedClasses, используемое для настройки sessionFactory, не указывает на правильные объекты в пакете.

Желательно также использовать свойство packagesToScan вместо annotatedClasses, поскольку оно сканирует весь пакет на предмет сущностей, что позволяет избежать явного упоминания сущностей с полностью определенными именами классов.

<bean id="sessionFactory" 
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="packagesToScan" value="com.code.entity"></property>
<property name="hibernateProperties">
<props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    <prop key="hbm2ddl.auto">update</prop>
    <prop key="hibernate.show_sql">true</prop>
</props>
</property>

2 голосов
/ 14 марта 2016

Я думаю, что написание пакета entites явно безопасно. Я получил эту ошибку и решил с помощью аннотации EntityScan.

@EntityScan(basePackages = "your.entities.pakage")
1 голос
/ 01 ноября 2009

Единственное, о чем я могу думать, это то, что в вашем определении annotatedClasses отсутствует рассматриваемая сущность. Можете ли вы перепроверить ваш def annotatedClasses, включая имена пакетов?

Правильно ли я думаю, что эта ошибка появляется при запуске? Можете ли вы включить немного больше контекста вокруг сообщения об ошибке? Например, я смог воспроизвести нечто похожее на то, что вы сообщаете, удалив один из классов из моего определения annotatedClasses:

2009-11-01 10:05:55.593::WARN:  Nested in org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invo
cation of init method failed; nested exception is org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.springinpractice.ch06.model.Message.forum references an unknown entity: com.springinpractice.ch06.model.
Forum:
org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.springinpractice.ch06.model.Message.forum references an unknown entity: com.springinpractice.ch06.model.Forum
        at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:81)
        at org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:456)

[надрез]

РЕДАКТИРОВАТЬ: Еще один вопрос / идея. У вас есть соответствующий JAR аннотаций (либо persistence.jar для JPA, либо JAR аннотаций Hibernate) на пути к классам во время выполнения?

ДРУГОЕ РЕДАКТИРОВАНИЕ: Еще один. Какую версию JVM вы используете?

1 голос
/ 01 ноября 2009

Убедитесь, что вы добавили правильные пространства имен в XML-контекст своего приложения Spring:

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...