[英]why hibernate forcing serialization in session.get method
我看到hibernate的session.get()和load()方法只接受Serializable對象。
根據我對hibernate的理解,它將生成一個SQL語句並將其發送給DBMS。 它永遠不需要通過網絡發送java對象。
為什么hibernate強制對我們進行序列化?
首先,Hibernate在某些簽名中使用Serializable
這一事實並不意味着Hibernate 將序列化任何東西,它只是意味着如果需要,參數是可序列化的。
然后,我找不到絕對的參考,但我認為最強的論點是:
一些較弱的參數(或根本不參數):
Session
本身可以被潛在地序列化(例如存儲在HttpSession
) entityId
的超類型(包括復合PK) 鑒於這一切,我認為強制API的用戶傳遞Serializable entityId
,這允許不關閉任何門並避免任何后來的限制(哎呀,你不能激活二級緩存因為這個pk不是Serializable
)。 這是IMO比使用Object
更好的設計決策。 說實話,我沒有看到任何煩惱。
這不是真的。 來自Javadoc ,相關方法的簽名是:
public Object get(Class clazz, Serializable id) ...
public Object load(Class theClass, Serializable id) ...
(為簡潔起見,省略了不相關的部分和其他重載版本)。
因此,要加載的實體可以是任何類,只有它的標識符需要可序列化。
根據來自Java Persistence with Hibernate的引用,實體確實不是可序列化的。 13.3.2:
持久化實例以反匯編形式存儲在二級緩存中。 將反匯編視為一個類似於序列化的過程(但算法比Java序列化要快得多)。
所以我猜測標識符(在查詢緩存中)也沒有序列化。 我找不到任何解釋為什么id
被聲明為Serializable
,並且缺乏這個,我只能猜測。 API需要一個id
參數的類型,它應該是至少常用的標識符類型Number
和String
的常見超類型,除了Object
, Serializable
是唯一的選擇。
我認為這是因為對緩存的支持。 當使用持久緩存或通過網絡分發對象的任何緩存時,您需要有一種方法來確保對象可以以通用格式傳輸,在本例中是Java序列化。
坦率地說,我沒有看到任何其他方式。 如果您不是定義表結構並生成插入語句以容納對象,那么生成的SQL語句本身就是一個字符串,它會將另一個文本字符串(您的序列化數據)插入到表的字段中。 無論你在數據庫中插入什么都必須是一個字符串,在這種情況下,它不能是一個具有語言相關方法的對象,除非你明確設計一個表來存儲這樣的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.