spring+hibernate=未知实体

hiz5n14c  于 2021-07-05  发布在  Java
关注(0)|答案(6)|浏览(289)

我试图使用注解将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
{
  ...
}

我的豆豆:

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);
  }

}
我将在 Spring 启用注解:

<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>

当我通过blazeds从flex应用程序调用foo.addbar方法时,我得到了这个错误。
我真的想避免额外的配置,似乎这一切都应该工作。
我使用的是Spring3.0.0.rc1、HibernateAnnotations3.4.0、Tomcat6.0.20和Java1.6.0。
有什么想法吗?谢谢。

hlswsv35

hlswsv351#

我唯一能想到的是,你的annotatedClass定义不知怎么地缺少了这个实体。你能仔细检查一下你的annotatedclasses def,包括包名吗?
我认为这个错误是在启动时出现的,对吗?你能在错误信息周围多加一点上下文吗?例如,通过从AnnotatedClass定义中删除其中一个类,我可以复制与您报告的内容类似的内容:

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 for jpa或hibernate注解jar)吗?
另一个编辑:再来一个。您正在运行哪个jvm版本?

igsr9ssn

igsr9ssn2#

确保已将正确的命名空间添加到spring应用程序上下文xml中:

<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>
cxfofazt

cxfofazt3#

我认为明确地写实体包是安全的。我得到了这个错误,并解决了使用entityscan注解。

@EntityScan(basePackages = "your.entities.pakage")
mbskvtky

mbskvtky4#

尝试使用 import @javax.persistence.Entity 而不是 org.hibernate.annotations.Entity 为了你的 Entity 注解。

t2a7ltrp

t2a7ltrp5#

如果用于配置sessionfactory的annotatedClass属性没有指向包中正确的实体,则上述异常也会发生。
还建议使用属性packagestoscan而不是annotatedClass,因为它扫描整个包中的实体,从而避免显式提到具有完全限定类名的实体。

<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>
ajsxfq5m

ajsxfq5m6#

我也遇到过同样的问题,但没有找到任何好的答案
对我起作用的是在persistence.xml文件中声明我的实体类
(资源和测试中):

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

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

    </persistence-unit>
</persistence>

相关问题