我收到以下Hibernate异常:
org.hibernate.AnnotationException: @OneToOne or @ManyToOne on cz.rohan.dusps.model.Switchport.konfiguracniTemplateAccess references an unknown entity: cz.rohan.dusps.model.KonfiguracniTemplate
org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:103)
org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:541)
org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:523)
org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:380)
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1377)
org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
cz.rohan.dusps.helper.SessionFactoryHelper.initFactory(SessionFactoryHelper.java:122)
cz.rohan.dusps.helper.SessionFactoryHelper.getSessionFactory(SessionFactoryHelper.java:134)
cz.rohan.dusps.filter.HistorieZmenFilter.doFilter(HistorieZmenFilter.java:102)
cz.rohan.dusps.filter.CharsetFilter.doFilter(CharsetFilter.java:41)
在与各种人一起度过这个问题大约20个小时之后,在阅读了所有可能的博客或论坛之后,我真的在这里绝望了。
这是一个中型项目。我应该提到数据库是Postgres 9.1,我们使用建模工具生成数据库。 Hibernate连接到数据库但不生成它。
我在数据库中创建了一个新实体,它被称为“KonfiguracniTemplate”(配置模板)。我已经创建了模型,控制器,表单,验证器,.jsp,它们基本上都是从类似性质的现有实体中以1:1复制的。我现在可以使用KonfiguracniTemplate,CRUD完全正常工作。
当我从名为Switchport的实体引用此KonfiguracniTemplate时出现问题。在DB中,两者之间存在关系:
在... / model / Switchport.java中,关系的映射就像所有其他正常工作的关系一样:
@ManyToOne
@JoinColumn(nullable = false)
private KonfiguracniTemplate konfiguracniTemplateAccess;
我尝试了各种形式:
@ManyToOne
@JoinColumn(name="konfiguracnitemplateaccess_id", nullable = false)
private KonfiguracniTemplate konfiguracniTemplateAccess;
或
@ManyToOne(targetEntity=KonfiguracniTemplate.class)
@JoinColumn(name="konfiguracnitemplateaccess_id", nullable = false)
private KonfiguracniTemplate konfiguracniTemplateAccess;
我也检查过:
无论我尝试什么,我都无法摆脱“引用未知实体”的异常。有人可以分享一个想法,或者可能如何调试问题?帖子顶部的堆栈跟踪是我在日志中得到的全部内容。
非常感谢所有输入!
答案 0 :(得分:10)
只需将团队类添加到“ hibernate-cfg.xml ”文件中,因为Hibernate在没有添加的情况下无法识别。
答案 1 :(得分:2)
可能的解决方案:
1)确保已在hibernate.cfg.xml中正确引用该实体
<hibernate-configuration>
<session-factory>
...
<mapping class="com.project.entitytwo.model.EntityTwo"/>
...
</session-factory>
2)确保已在班级指定@Entity(在班级顶部)
@Entity
@Table( name="ENTITY_TWO" )
public class EntityTwo extends AnyClass
{
...
答案 2 :(得分:1)
最后得到了团队中另一位开发人员的解决方案!
在创建SessionFactory对象之前,需要导入类。这里缺少新类的导入,因此SessionFactory对象是未知的。
无论如何,感谢大家的提示!
答案 3 :(得分:1)
我刚遇到此问题,实体a
引用了实体b
。这两个实体都位于我正在处理的Web项目之外的公共JAR中; a
在persistence.xml中声明,但b
不是。我将b
放在persistence.xml中的<class>
标记中并且它有效!
答案 4 :(得分:1)
我在使用Spring而不使用hibernate.cfg.xml
文件时遇到了这个问题。通过将Model
类的完全限定包名称添加到setPackagesToScan
类的LocalSessionFactoryBean
方法来解决此问题。
答案 5 :(得分:0)
还有一次机会获得此类异常;当你在hibernate.cfg.xml文件中没有提到你的映射类时。 如上所述。
答案 6 :(得分:0)
我有同样的异常......我忘了在MASTER类(带主键的类)上添加注释(@Entity
和@Table
)
所以解决方案是仔细检查实体中的每个注释,我的意思不仅仅是@ManyToOne
和@OneToMany
。
答案 7 :(得分:0)
如果你的两个实体在不同的项目中,你可以在其他项目中扫描KonfiguracniTemplate的包。你可以在春季启动时这样做
@EntityScan({"com.thispackage.entity","com.KonfiguracniTemplatepackage.entity"})
答案 8 :(得分:0)
我将为您提供一个解决方案,该解决方案应该适用于 Spring Boot 的相同错误。这与最初的问题关系不大,但今天,人们可能会寻找这个答案,因为今天没有人再使用 XML 配置了。
我遇到了同样的问题,并在此网站上找到了解决方案:https://www.programmersought.com/article/1617314625/
他甚至描述了他本来会查的这个问题,但后来我问自己:为什么他在找到解决方案后不在这里回答?哈哈
他自己的话:
<块引用>在Spring Boot项目中,默认的扫描包是main方法所在的包,即只有和main方法在同一个包中的实体类才会被发现。这样你就可以理解为什么找不到 User 了:因为 User 是另一个模块中的实体类。 Spring Boot 根本不扫描其他包;
在启动应用程序的 main 方法上配置 @SpringBootApplication
注释,告诉 Spring Boot 需要扫描这些包:@SpringBootApplication(scanBasePackages = {“com.xiaomo.*”})
然后,可以找到用户。
所以你基本上重新配置 SpringBoot 以扫描更多包以包含其他包。
我个人的补充:您也可以将您的包裹移到 starter 所在的包裹中或将 starter 向上移动一个包裹(这就是我所做的)。