2017-07-13 52 views
0

我的問題是關於休眠 - 所以說你有兩個對象,你正在排隊保存到你的數據庫。這些對象對於每個字段具有完全相同的值。我的hibernate被配置爲在50次查詢後自動刷新,因此讓我們假設它在通過休眠會話後不會立即將這些對象刷新到數據庫。休眠是否將每個對象作爲不同的實體保存到數據庫中(這樣它會將重複記錄保存爲「獨特」記錄),或者是否確認這些對象具有完全相同的值,並且只保存這些鏡像對象的一個​​實例數據庫?休眠的細微差別會話

+0

他們有一個Id字段,它們的值是什麼? –

+0

id字段是由hibernate生成和處理的序列。字段值是clobs和字符串。 – Daniel

+0

保存時間的值是多少? –

回答

0

是否最終在數據庫中有一個或兩個實體取決於equals()(和hashcode,分別)的實現。如果對象被認爲是平等的,你最終會得到一個實體,但如果不是,你最終會得到兩個實體。

使用自動生成的代理鍵時必須格外小心:在第一次保存對象之前,尚未分配鍵。因此任何equals()實現都不能依賴關鍵的等式。您必須確保您處理這種特殊情況 。

+0

好吧,因爲我沒有爲這些對象實現等號或哈希碼,所以可能我的假設是正確的 - 休眠是查看對象作爲重複,因此只保存一個副本到數據庫? – Daniel

+1

我不認爲這是正確的,但默認行爲是檢查對象是否引用相同的對象不是嗎?情況並非如此,這些是佔據不同存儲位置的不同對象。 – Daniel

+0

是的,當且僅當它們是相同的(x = y)時,equals()的默認實現才返回true。如果您創建了兩個實體實例,則最終將在數據庫中包含兩個實體(=行)。但是,如果對象相同,則將它們添加到會話兩次只會導致一個實體。 – fhossfel

0

我的問題是關於休眠 - 所以說你有兩個對象, 你排隊保存到你的數據庫。

讓我們來重述一下 - 我們有兩個我們想要在數據庫中持久化的實體。

這些對象對於每個字段具有完全相同的值。

在Java中,有一個由equals(和hashcode)實現的對象標識。在數據庫中有行標識 - 標識唯一行的主鍵(轉換爲唯一實例)。由於我們將實體的實例映射到表中,因此區分同一類(同一實體)的兩個實例的方法是爲每個實例提供唯一的主鍵。在JPA(Hibernate是JPA的實現)中,您需要使用@Id註釋來註釋字段(Entity的屬性),例如它可以被唯一標識。

下面的類是具有唯一標識的實體類。

@Entity 
public MyClass 

@Id 
@GeneratedValue 
private Long id; 

你可以提供一個唯一的ID每次持續時間,或者你可以使用自動生成與@GeneratedValue。根據底層數據庫有不同的生成策略。

+0

是的,我理解並完成了這一切。他們有一個Id對象字段,使用JPA註釋進行註釋。我讓休眠處理id創建,因爲它由序列數據庫端填充。但是我失去了記錄,它們不復存在 – Daniel

+0

請提供更多信息,您如何堅持以及如何控制交易。我剛剛提供了這些信息來表明Java身份對JPA無關緊要,它具有自己的身份認識。 – fg78nc

+0

AOP Spring事務管理,保存對象的方法用帶有可序列化隔離級別的@Transactional標籤進行註釋。我使用的是Spring Data JPA,所以我甚至沒有管理對象何時會存在,如果我的理解是正確的,那麼這個功能就會從我這裏抽象出來 - 我用JPA存儲庫保存對象。 – Daniel