2016-01-01 28 views
0

我有一個JPA實體,可以是子類,定義如下獲取子類:從EntityManager.find()

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "IDTYPE", 
    discriminatorType = DiscriminatorType.STRING, 
    length = 12) 
public class BaseObject implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    //etc 

這樣做的好處是,BaseObject及其所有子類份額相同的ID字段 - 每個值都是唯一的。我的問題是,當我做一個EntityManager.find()基類是這樣的:

@PersistenceContext protected EntityManager em; 

// find a record. 

BaseObject obj = em.find(BaseObject.class, longIDValue); 

請問發現如果使用該特定ID方法返回的子類中的一個?或者它會始終只返回一個BaseClass對象?

後續問題:這種行爲在不同的JPA實現中是否一致? (例如,Hibernate與EclipseLink)

+0

當你這樣做會發生什麼?當我用DataNucleus JPA做到這一點時,我得到了正確的類型......即可以是子類。就像JPA規範 –

+0

@NeilStockton我在使用我的應用程序時遇到問題,所以我還沒有得到測試。但即使它工作,我想確保我沒有做一些依賴於實現的東西。我錯過了規範中的內容 - 如果您可以發佈鏈接,我會將其標記爲答案。 – AlanObject

+1

你確定你想/需要一個具有連接繼承的超級實體嗎?這會導致關鍵減速,特別是在* @ OneToMany/@ ManyToMany *關係中。 –

回答

2

EntityManager.find()返回指定的「id」和entityClass類型的實例。如果你有繼承並提供超類,並且「」意味着一個子類的實例,那麼這將返回子類(多態性)。爲什麼在表中添加鑑別符的全部原因是爲了讓實現爲你提供這種處理。

find()(不是他們打擾增添了說明)JPA規範描述不明確狀態這種行爲,雖然它具有如上做的是一個基本的JPQL查詢「SELECT b FROM BaseClass b」,這將返回實例一致子類的對象是那種類型的。