org.hibernate.AnnotationException:<entity>上的@OneToOne或@ManyToOne引用未知实体</entity>

时间:2011-09-08 14:38:40

标签: java hibernate annotations entity many-to-one

我收到以下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中,两者之间存在关系:

  • Switchport 1:1 ... 0:N KonfiguracniTemplate(switchport始终引用KonfiguracniTemplate; KonfiguracniTemplate可以被引用零次或多次)
  • Switchport对此关系有FK konfiguracniTemplateAccess_id。

在... / 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;

我也检查过:

  • 两个实体都在同一个包中
  • 使用“import javax.persistence.Entity;”对它们进行注释“@Entity”。
  • 构建不会产生错误/警告消息
  • 只要Switchport中的引用被注释掉,一切都很好

无论我尝试什么,我都无法摆脱“引用未知实体”的异常。有人可以分享一个想法,或者可能如何调试问题?帖子顶部的堆栈跟踪是我在日志中得到的全部内容。

非常感谢所有输入!

9 个答案:

答案 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 向上移动一个包裹(这就是我所做的)。