簡體   English   中英

為什么hibernate強制在session.get方法中進行序列化

[英]why hibernate forcing serialization in session.get method

我看到hibernate的session.get()和load()方法只接受Serializable對象。

根據我對hibernate的理解,它將生成一個SQL語句並將其發送給DBMS。 它永遠不需要通過網絡發送java對象。

為什么hibernate強制對我們進行序列化?

首先,Hibernate在某些簽名中使用Serializable這一事實並不意味着Hibernate 序列化任何東西,它只是意味着如果需要,參數是可序列化的。

然后,我找不到絕對的參考,但我認為最強的論點是:

  • 實體ID用作緩存的密鑰(第一級,第二級),並且可以通過網絡發送

一些較弱的參數(或根本不參數):

  • Session本身可以被潛在地序列化(例如存儲在HttpSession
  • Hibernate需要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參數的類型,它應該是至少常用的標識符類型NumberString的常見超類型,除了ObjectSerializable是唯一的選擇。

我認為這是因為對緩存的支持。 當使用持久緩存或通過網絡分發對象的任何緩存時,您需要有一種方法來確保對象可以以通用格式傳輸,在本例中是Java序列化。

坦率地說,我沒有看到任何其他方式。 如果您不是定義表結構並生成插入語句以容納對象,那么生成的SQL語句本身就是一個字符串,它會將另一個文本字符串(您的序列化數據)插入到表的字段中。 無論你在數據庫中插入什么都必須是一個字符串,在這種情況下,它不能是一個具有語言相關方法的對象,除非你明確設計一個表來存儲這樣的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM