Hibernate @ManyToOne引用了一个未知实体

时间:2010-10-20 23:31:53

标签: java hibernate jpa

我收到以下Hibernate异常:

@OneToOne or @ManyToOne on Matchup.awayTeam references an unknown entity: Team

简化的Matchup类如下所示:

@Entity public class Matchup implements Serializable 
{
   protected Team awayTeam;

   @ManyToOne 
   @JoinColumn(name="away_team_id")
   public Team getAwayTeam() {
      return awayTeam;
   }
}

简化的Team类看起来像这样:

@Entity
public class Team implements Serializable {
    protected List<Matchup> matchups;

    @OneToMany(mappedBy="awayTeam", targetEntity = Matchup.class,
    fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    public List<Matchup> getMatchups() {
       return matchups;
    }
}

注意:

  • Matchup和Team都有子类。我不确定这是否会影响这种情况。
  • Matchup和Team都列在我的persistence.xml中 包括在内。
  • 如果我在两个getter方法上都放了@Transient注释,那就是错误 消失。

有人能说清楚为什么会发生这种异常吗?

13 个答案:

答案 0 :(得分:62)

我发现了问题:我没有将类Team添加到Hibernate AnnotationConfiguration对象中。因此,Hibernate没有认识到这个类。

答案 1 :(得分:19)

除了在hibernate.cfg.xml中输入外,您还需要对引用的类进行@Entity注释。

答案 2 :(得分:4)

另一种解决方案:检查以确保引用的类包含在hibernate.cfg.xml文件中。

答案 3 :(得分:3)

我在一个使用Spring和Hibernate 4的项目中工作,我发现我们有一个hibernate.cfg.xml文件。相反,我们的bean列在文件applicationContext.xml中,看起来有点像

<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
    <property name="annotatedClasses">
        <list>
            <value>com.package.Bean</value>
        </list>
    </property>
</bean>

将我的bean添加到列表中解决了问题。您可以找到更多信息here

答案 4 :(得分:1)

如果您不使用hibernate.cfg.xml,则可以在@ManyToOne/@OneToMany批注中添加targetEntity参数,并使用描述您的实体的类。

例如:

@ManyToOne(targetEntity = some.package.MyEntity.class)

答案 5 :(得分:0)

尝试添加限定名称(ClassNAME),如下所示:

<hibernate-configuration>
    <session-factory name="java:/hibernate/SessionFactory">
                  <mapping class="co.com.paq.ClassNAME" />
        </session-factory>
</hibernate-configuration>

在文件中:

META-INF/hibernate.cfg.xml

答案 6 :(得分:0)

Add the class in hibernate.cfg in proper order. First map the file that is going to be referred by another class

答案 7 :(得分:0)

我遇到了同样的问题,最近两个小时我一直在努力。我终于发现packageToscan属性中的值和实际的包名称大小写不匹配。 程序包为大写(DAO),程序包Toscan的值为dao。只是想添加它,以防有人发现它对您有帮助

答案 8 :(得分:0)

如果您将Spring Boot与hibernate结合使用,那么实际上您可能只需要将该软件包添加到@EntityScan基本软件包数组中即可。

@SpringBootApplication(scanBasePackages = {"com.domain.foo.bar.*"})
@EnableJpaRepositories(basePackages ={"com.domain.foo.bar.*"})
@EntityScan(basePackages ={"com.domain.foo.bar.*", "com.domain.another.*"})
public class SpringBootApplication extends SpringBootServletInitializer {
}

答案 9 :(得分:0)

在我的情况下,persistence.xml列出了除一个...以外的所有实体类。

答案 10 :(得分:0)

在persistence.xml的 all persistence-units 中添加实体

示例

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence              http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="SystemDataBaseDS" transaction-type="JTA">
    <jta-data-source>java:jboss/datasources/SystemDataBaseDS</jta-data-source>
    <class>package.EntityClass</class>
    ...
  </persistence-unit>
  <persistence-unit name="SystemDataBaseJDBC" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>package.EntityClass</class>
    ...
  </persistence-unit>
</persistence>

答案 11 :(得分:0)

就我而言,我必须查看所有用 @Configuration 注释的类。其中一个类定义了一个 EntityManagerFactory bean,如下所示:

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPackagesToScan("com.mypackage.entities");
    // omitted
}

而我在包 com.mypackage.components.user.persistence 中放置了一个新实体。 所以我不得不将 EntityManagerFactory bean 定义的最后一行更新为:

em.setPackagesToScan("com.mypackage.entities", "com.mypackage.components");

此外,查看 @EnableJpaRepositories 注释并检查其 basePackages 属性也无妨。很可能您的新实体位于属性值中列出的包之外。

答案 12 :(得分:-1)

unknown entity错误不是休眠注释问题,而是该实体未被识别。无论您使用的是纯JPA,Hibernate还是Spring,都应检查持久性设置。

默认情况下,Hibernate能够找到JPA实体类 基于@Entity批注的存在,因此您不需要 声明实体类。

使用Spring,您将有一个类似于以下内容的@Bean,以确保您的软件包中没有未知的实体。

@Bean
open fun entityManagerFactory() : 
LocalContainerEntityManagerFactoryBean {
    val em = LocalContainerEntityManagerFactoryBean()
    em.setPackagesToScan("com.package.domain.entity")

    //...
}

GL

Source