2009-07-28 97 views
0

短版創建的主鍵:查找Hibernate的JPA

有沒有一種簡單的方法做一個合併()在休眠JPA後獲得主鍵的值?

詳細信息:

我在做一個使用Hibernate的通用庫。該庫使用JPA的merge()將POJO序列化到數據庫。發現主鍵的新價值的最佳方式是什麼?我假設主鍵永遠不會是一個複合鍵。但是,有些情況下POJO是包含主鍵的類的子類。所以,在POJO上使用反射並不是一個簡單的答案(即有必要反映類和所有超類)。

有什麼建議嗎?

回答

1

Hibernate SessionFactory具有這樣的方法: SessionFactory.getClassMetaData()。getIdentifierPropertyName()。從那裏我能夠得到它的工作。

謝謝大家!

+0

美麗!謝謝! – 2013-03-16 01:57:39

-1

合併假設你已經擁有持久化實例,它不應該修改你PK

-1

我們有,每一個實體有long類型的主鍵的應用程序。然後,我們迫使所有的實體類來實現它包含一個方法的接口Idable

Long getId(); 

對於需要ID的通用代碼,我們就可以轉換爲Idable並調用getId()檢索主鍵。

如果你的類可能包含不同類型,你可以使getId()方法的返回Object其中JDK5的Covariant Return Types功能將允許你仍然可以正常使用(即使類聲明以返回不同的類型,如Long方法)。在這種情況下,如果類的主鍵未被調用「id」,則需要將方法實現標記爲@Transient,以便Hibernate/JPA不會將其作爲單獨的屬性進行提取。

+0

真的,downvote? 4年後?你可能至少麻煩解釋爲什麼這個答案是*錯誤*(提示:它不是,即使它可能不適用於*你*) – 2013-03-18 18:01:18

0

您可以查看類(和父類)中的所有方法(或字段),直到找到帶有@Id標記的方法(或字段),然後使用該字段從合併的返回結果中獲取值呼叫。

除此之外,我不知道有什麼方法不知道什麼元素是直接。

編輯就像別人提到一個人,你可能需要一個標準方法 - 這可能是一個接口上。因此,您可以將類轉換爲該接口,然後從中取出id。

-1

我所有的持久化類都從PersistentObject繼承,它提供了id和版本字段。 其他提供一個getter方法,真的沒有其他方式獲得該ID。