2011-09-08 60 views
6

我收到以下休眠例外:org.hibernate.AnnotationException:上<entity>引用一個未知的實體@OneToOne或@ManyToOne

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有兩者之間的關係:

  • 交換機端口1:1 ... 0:N KonfiguracniTemplate(交換機端口總是引用KonfiguracniTemplate;一個KonfiguracniTemplate可以參考零次或多次)
  • 交換機端口具有FK konfiguracniTemplateAccess_id爲這個關係。

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

我也檢查過:

  • 兩個實體都在同一個包
  • 它們都註明「@Entity」使用「進口javax.persistence.Entity;」
  • 構建不產生錯誤/警告消息
  • 只要在交換機端口參考被註釋掉了,一切都很好

無論我怎麼努力,我不能擺脫「引用一個未知的實體「例外。有人可以分享一個想法正在發生什麼或者如何調試這個問題?在帖子頂部的堆棧跟蹤是我在日誌中獲得的。

所有的輸入是非常感謝!

+0

在編譯或開發之後會發生這種情況嗎?你的單元測試是否運行? – hvgotcodes

+0

這是一個運行時異常。構建成功後,我可以訪問登錄表單,提交併獲得例外。我們不做單元測試。 – Martin

+0

你有沒有檢查你的jar,並確保在構建之後jar中存在缺失類的類文件? – hvgotcodes

回答

1

終於從團隊中的其他開發人員那裏得到了解決方案!

需要在創建SessionFactory對象之前導入這些類。這裏新類的導入丟失了,所以SessionFactory對象是未知的。

無論如何,感謝大家的提示!

+10

你究竟是如何解決這個問題的?你編輯了哪個文件?你能詳細介紹一下你做了什麼。 – riship89

9

只需添加到「休眠-cfg.xml中」文件,因爲Hibernate不無添加進去辨認。

0

還有一個機會得到這樣的例外;當你在hibernate.cfg.xml文件中沒有提到你的映射類的時候。 如上所述。

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 
{ 
    ... 
0

我有同樣的exc主器件接收......我只是忘了在大師班添加註釋(@Entity@Table)(類主鍵)

這樣的解決辦法是仔細檢查你的實體每個註釋,我指的不僅是@ManyToOne@OneToMany像我一樣。

1

我剛剛有這個問題,實體a引用實體b。這兩個實體都位於我正在開發的Web項目之外的通用JAR中; a在persistence.xml中聲明,但b不是。我將b放在persistence.xml中的<class>標記中,它工作正常!

+1

謝謝@Nick。你救了我的命。 –

+1

@VictorViola不客氣,很高興我能幫上忙! – Nick

1

我在使用Spring時沒有遇到這個問題,也沒有使用hibernate.cfg.xml文件。這是通過將Model類的完全合格包名添加到LocalSessionFactoryBean類的setPackagesToScan方法來解決的。

相關問題