2013-03-19 45 views
0

我有一堆完全相同的列表,比方說,ID,NAME,DESCRIPTION。由於遺留原因,我無法更改這些表格。使用JPARepository來處理抽象實體的正確方法?

在我的模型中,我使用@MappedSuperclass註解爲這些模型創建了一個抽象超類。然後,我創建了它庫:

JpaRepository<MyAbstractEntity, Long> 

但這似乎不JPARepository工作(或者更確切地說休眠?),因爲它不是一個真正的實體。

那麼處理這樣的層次結構的首選方法是什麼?

+0

究竟是什麼「似乎沒有工作」? – 2013-03-19 12:40:05

+0

使用「@MappedSuperclass」這個「不起作用」,但失敗並且不是託管類型錯誤。但是,使用「@Entity」和「@Inheritance」作爲基類它確實有效。 – wannabeartist 2013-03-19 12:54:24

回答

3

我假設你使用Hibernate作爲持久性提供者?它有a bug,當被要求映射超類時,不返回相關的JPA元模型類型。這在Hibernate 4.1.6中得到了解決,因此升級到該版本應該可以解決問題。

+0

我正在使用Hibernate(應該在原帖中明確提到它) - 版本4.1.9 - 我發誓我在發佈之前看到了那個錯誤,但是很奇怪。如果您使用「@Mappedsuperclass」或「@Entity」和「@Inheritance」,是否有區別? – wannabeartist 2013-03-19 14:19:42

+1

我們基本上嘗試使用您在存儲庫中聲明的域類型來查找id屬性。我們這樣做使用JPA元模型API,所以假設您的提供者通過'Metamodel.managedType(...)'正確地公開了我們很好。這是否意味着它現在適合你? – 2013-03-19 14:27:56

+0

是的,現在我再次嘗試「@Mappedsuperclass」,它工作正常。生成的表結構看起來與其他方法相同,但對於「@Mappedsuperclass」,我也可以使用「GenerationType.IDENTITY」作爲ID,這非常棒,因爲它對我的DBUnit測試效果更好。使用「@Entity」和「@Inheritance」時,我不得不切換到GenerationType.TABLE,因爲生成的ID不斷變化,所以很難用DBUnit進行測試。 – wannabeartist 2013-03-19 14:43:17

1

問題是,repository如何知道基於抽象類查詢哪個表? 對我來說,最好的方法是根據具體的類創建需要的存儲庫。

+0

那麼,我確實忘記了這一點。但是:實際上它看起來像使用返回類型來確定表,所以你可以有一個基類的存儲庫和返回子類的查詢方法,它看起來像是有效的。 – wannabeartist 2013-03-19 12:47:49

相關問題