2010-07-25 71 views
13

對於每一個@Entity我需要執行以下操作:如何獲得任何JPA實體的主鍵?

public <Entity> boolean insert(final Entity entity){ 
    if (em.find(entity.getClass(), entity.getId()) == null) { 
     et.begin(); 
     em.persist(entity); 
     et.commit(); 
     return true; 
    } 
    return false; 
} 

這就是堅持的實體,如果不存在,並知道它做了或不存在。 隨着實體我試圖達到@Entity,但我意識到它不是一個繼承關係。 我可以使用什麼類來引用每個JPA實體?我可以創建一個接口/抽象類MyEntities並讓它們都繼承,但是這樣嗎? 我希望減少代碼。另外,我希望能夠提取每個實體的主鍵,就像我在.getId()中嘗試的那樣。

回答

36

此功能是在JPA 2.0中添加的。簡單地調用:

Object id = entityManagerFactory.getPersistenceUnitUtil().getIdentifier(entity); 
+0

引發空指針異常 – 2015-09-17 06:57:57

4

通用接口方法是我使用的,它工作正常。使用純粹的JPA我沒有看到獲取標識符的方法。

看看merge()。我沒有用它自己很多,但我認爲

Hibernate有這樣

Serializable id = session.getIdentifier(entity); 

方式但這不是JPA標準。

4

閱讀關於Generic Dao approach的文章。

我不明白你的問題,但如果你想獲得實體ID - 只是得到它。它可以堅持後的方法是完整的,即

em.persist(entity); 
et.commit(); 
int id = entity.getId() 

我通常做的一類AbstractEntity與現場id及其訪問者和繼承這個類的所有我的其他實體。

這種方法的唯一問題是,如果您需要創建任何您的實體Serializable,則必須使AbstractEntity可序列化,即所有其他實體都將變爲可序列化。否則字段id將不會在應該可序列化的實體中序列化。

1

獲取實體ID的另一種方法是:

Session session = entityManager.unwrap(Session.class); 
Object entityId = session.getId(entity); 

這種方法使用extractPrimaryKeyFromObject()從ObjectBuilder的方法。