2013-06-25 49 views
0

根據我對管理一致性序列化的理解,在保存/獲取流中的對象時,在類中保持一個序列化ID爲private static final long serialVersionUID = 3170588813843556321L;。並且該ID將被保存在該文件/流中。hibernate如何在保存/從DB中獲取對象時管理序列化id

但是對於數據庫,我們並沒有將它保存在數據庫中,所以如何在反序列化過程中檢查一致性並拋出java.io.InvalidClassException

請糾正我,如果我錯了,在我的理解....

回答

0

休眠不使用序列化到類存儲到數據庫中。它通過object relational mapping工作,並且(簡單地)將對象的每個屬性映射到表中的列。 只有當你有特定類型的屬性(比如說public Image getImage())它會存儲「真正的」二進制文件 - 它可能將這個屬性映射到一個blob,以使用序列化/反序列化來存儲/加載映射類的圖像屬性。

檢查hibernate中的數據一致性是通過顯式鎖定(只要實體正在使用,鎖定構成實體的行)或通過optimistic locking - 在其中將「version」字段添加到您的實體,每次修改實體時更新它,並使用表格"update table set ... where version=:myVersion"的sql來確保沒有2個進程同時修改同一個實體。

+0

我不是在談論基本上在併發訪問/修改中使用的hibernate的鎖管理,這是關於'serialVersionUID',我們必須在每個DTO中使用Hibernate來維護它。 ............. 因此,如果hibernate不關心序列化,那麼爲什麼這是強制實施DTO的'java.io.Serializable'。 – Atul

+0

DTO和休眠(JPA)類不必是相同的東西。 DTO通常被傳遞,有時被遠程發送,所以必須是可序列化的。 JPA實體只存儲到數據庫並從中讀回(當然,同一個類可以同時使用)。還有 - 它的_RECOMMENDED_你設置了一個顯式的串行UID。你不必。 – radai

+0

太棒了!非常感謝 ... – Atul

相關問題