8

我收到以下休眠异常:

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 时,问题就出现了。在数据库中,两者之间存在关系:

  • 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中的引用注释掉就可以了

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

非常感谢所有输入!

4

9 回答 9

10

只需将类Team添加到“ hibernate-cfg.xml ”文件中,因为 Hibernate 不添加就无法识别。

于 2013-09-03T06:49:13.563 回答
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
{
    ...
于 2014-06-27T13:32:30.627 回答
2

我刚刚遇到了这个问题,实体a引用了 entity b。这两个实体都位于我正在处理的 Web 项目之外的公共 JAR 中;a在persistence.xml 中声明但b没有。我在persistence.xml 中添加b了一个<class>标签,它起作用了!

于 2015-05-13T22:08:44.037 回答
1

终于从团队中的另一位开发人员那里得到了解决方案!

在创建 SessionFactory 对象之前需要导入这些类。这里缺少新类的导入,因此 SessionFactory 对象不知道它。

无论如何,谢谢大家的提示!

于 2011-09-09T09:05:48.447 回答
1

hibernate.cfg.xml我在使用 Spring 而不是使用该文件时遇到了这个问题。通过将类的完全限定包名添加到Model类的setPackagesToScan方法来解决它LocalSessionFactoryBean

于 2015-12-15T18:10:20.493 回答
0

我有同样的例外......我只是忘记在 MASTER 类(带主键的类)上添加注释(@Entity和)@Table

所以解决方案是仔细检查实体中的每个注释,我的意思是不仅@ManyToOne@OneToMany我一样。

于 2014-12-06T21:51:23.033 回答
0

获得此类例外的机会增加一次;当您没有在 hibernate.cfg.xml 文件中提及您的映射类时。正如刚才提到的。

于 2013-12-09T14:57:19.997 回答
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.*”}) 然后,可以找到 User。

因此,您基本上重新配置 SpringBoot 以扫描更多包以包含其他包。

我个人的补充:您还可以将您的包裹移动到启动器所在的包裹中,或者将启动器向上移动一个包裹(这就是我所做的)。

于 2021-03-28T07:00:39.690 回答
0

如果你的两个实体在不同的项目中,你可以在其他项目中扫描 KonfiguracniTemplate 的包。你可以在 spring boot 中这样做

@EntityScan({"com.thispackage.entity","com.KonfiguracniTemplatepackage.entity"})

于 2018-05-12T16:35:52.537 回答