我收到以下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;
}
}
注意:
有人能说清楚为什么会发生这种异常吗?
答案 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