2014-11-06 84 views
1

如果我指定休眠錯誤單個表繼承

@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@Table(name = "tablename") 
爲子類

爲超類,和

@Table(name = "tablename") 

,休眠拋出(僅顯示最終原因)在應用程序啓動一個異常:

Caused by: org.hibernate.AnnotationException: Foreign key circularity dependency involving the following tables: 
at org.hibernate.cfg.Configuration.buildRecursiveOrderedFkSecondPasses(Configuration.java:1570) 
at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1511) 
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1420) 
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) 
... 98 more 

正如你在上面的例子中看到的,它並沒有說明哪些表是involv在依賴關係循環中編輯。

如果有人有任何建議可能是什麼問題,我會很高興。

+0

您是否正確定義了鑑別器? – Dmytro 2014-11-06 10:00:07

+0

如果我定義它沒關係,錯誤不會改變。 – 2014-11-06 10:12:01

+0

你可以在這裏發佈你的實體嗎? – RE350 2014-11-06 12:12:39

回答

1

同時,我設法找到了問題。問題很簡單直接,只有例外的信息非常無益。

問題的根源是,有超類的超類(可以稱之爲基類)作爲原打算只是作爲一個多對多的對象類型的常見抽象類,被明確指定爲@Inheritance(strategy = InheritanceType.JOINED)。例如,它會指定一個通用的@Id字段,時間戳,什麼。

被標記爲@Entity@Id聲明不會否則工作(並必須指定基類的每個子類一個@Id)。最終的解決方案似乎是我們必須這樣做 - 爲每個基類的子類分別指定id,也許爲基類的非單個表繼承的子類創建一箇中間類,以避免大量的克隆。

更新: 的很好的解決方案是使用@MappedSuperclass,所以超不必是@Entity,但子類可以繼承各自的領域和領域的註釋,包括@Id。