2011-01-11 21 views
2

如何在調用entityManager.persist(object);如何將java對象的id與其關聯的db行同步?

並提交事務後將java對象的id與其關聯的db行同步? 如果您正在使用數據庫設置ID的任何策略,則需要從數據庫中獲取該ID並將其設置爲對象,如果您想在將來的查詢中使用對象。這:

entityManager.refresh(object); 

不起作用,因爲它使用id來查詢對象,這就是缺少的。 我唯一能想到的就是查詢數據庫的唯一屬性,然後在對象上設置ID。

也許有一個最好的做法爲id世代解決這個我不知道。

回答

4

persist()使得實例進行管理,這意味着呼喚persist()當事務提交id會在那裏。你可以這樣檢查,

System.out.println(someEntity.getId()); // null at this point of time 
em.persist(someEntity) 
System.out.println(someEntity.getId()); // should print the id 
0

就我個人而言,我不讓數據庫自動生成我的ID。相反,我使用隨機128位數字,並在我的應用程序層內創建初始對象期間自己設置它們。如果我的數據庫引擎支持它,我將它們存儲在VARBINARY(16)或最好是BINARY(16)中。

我不知道確切的答案,因爲它涉及到Hibernate,但如果你想獲得自動生成的ID的回到你身邊,這種聯繫可能會提供一些線索:

http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Connection.html#prepareStatement(java.lang.String,%20int

特別通知的第二個參數:

Connection.prepareStatement(String sql, int autoGeneratedKeys) 

大概有辦法讓Hibernate的調用與是Statement.RETURN_GENERATED_KEYS的值第二個參數!

1

如果id策略是像序列一樣由數據庫生成的持久化對象,persist將修改持久化對象,那麼id將在持久對象中設置。

+1

persist返回void bruv。 – 2011-01-11 06:11:07

+1

啊,它確實如此。感謝機會。我認爲它返回了實體,因爲這正是我在實現dao時所做的。 – digitaljoel 2011-01-11 07:23:33

相關問題