2013-06-24 47 views
3

我知道這裏有一些帖子,但他們大概一年沒有迴應。其實我們在PostgreSQL 8.4上使用Hibernate 4.2.1.Final。我們有兩個實體來說這樣Hibernate Polymorphism.EXPLICIT註解不起作用?

實體A(頂類層次結構)

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@Polymorphism(type = PolymorphismType.EXPLICIT) 
public class A { 
    @Id 
    @GeneratedValue 
    private Long id; 

    public A() { 

    } 

    public A(Long id) { 
     super(); 
     this.id = id; 
    } 

    // Setters, getteres, hashCode and equals 
} 

實體B(子類)

@Entity 
public class B extends A{ 
    String value; 

    public B(){ 

    } 

    public B(String value) { 
     super(); 
     this.value = value; 
    } 

    public B(Long id, String value) { 
     super(id); 
     this.value = value; 
    } 

    // Setters, getteres, hashCode and equals 
} 

正如你所看到的,一個實體都被註解PolymorphismType.EXPLICIT但是當提取頂級類別時

ArrayList<A> lista = (ArrayList<A>) session.createCriteria(A.class).list(); 

我們還得到了String value屬性的B子類。實際上,SQL語句包含left outer join B。這仍然是第四版Hibernate中的錯誤,或者我做錯了什麼?

問候

回答

4

在我看來,相關文檔和功能本身是非常混亂的。從Chapter 5

顯式多態性意味着類實例將僅由顯式命名該類的查詢返回。

這將告訴我,您的查詢應該工作。但是,你正在試圖做的似乎並不成爲他們的意圖,因爲你可以在同一段落後看到:當兩個不同的類映射到同一個表

明確多態性是有用這使得「輕量級「類,其中包含表列的子集。

他們在這裏討論的是BA映射到同一個表,但沒有實際的類關係。你可以在舊的JIRA ticket中看到這個觀點。我想這意味着如果他們沒有類關係,但在同一個表中,那麼你可以使用IMPLICIT多態性來獲得兩個相同的查詢,但是這似乎完全奇怪,因爲他們不共享Java子類。

因此,總結是PolymorphismType.EXPLICIT不會做你認爲它的工作。在我看來,應該根據上面的第一個報價做你期望的。

+1

是的,文件是非常混亂,應澄清。所以現在,問題是知道我們使用_table per subclass_而不是在同一個表中使用A和B(因爲真正的模式不是那麼簡單),所以有一種方法可以只提取一個實體而不需要獲取所有的數據和作曲手動創建A實例的響應?我的意思是,沒有'left outer join B'的'SELECT' SQL語句。 謝謝 – hespresati

+0

你可以打破A和B之間的繼承關係嗎? – sharakan

+0

我認爲我們不能。真正的傳統模式是像Conact這樣的樹,它擴展了聯繫人和擴展聯繫人的Person。還有另外一些實體從公司延伸出來,更多的實體從Person延伸到 – hespresati