簡體   English   中英

序列化與數據庫存儲

[英]Serialization vs DB Storage

我目前正在研究Java序列化。 但是,我仍然對其實用性感到困惑。 一般而言,與直接將數據存儲在各種數據庫列中相比,我們應該何時使用序列化?

我認為您將序列化與讀寫對象到數據庫混淆了。

如此SO答案中所述,休眠表類是否需要可序列化? JPA對象(休眠模式)應該實現Serializable以便可以通過RMI將分離的實體發送到應用程序的其他層。

這與Hibernate如何將數據讀取和寫入數據庫無關。 只要您不使用分離對象,就可以不用實體實現Serializable而擺脫Serializable ,休眠仍然可以正常工作。

Hibernate通過JDBC讀寫數據庫,就像您自己編寫SQL查詢一樣。 如果您想了解更多有關hibernate如何將對象字段轉換為JDBC方法的信息,可以先查看Hibernate UserType 默認情況下,Hibernate具有許多內置的用戶類型,可以將StringDateint等類型的ResultSet列與數據庫進行相互轉換。 如果您需要編寫偶爾出現的自己的UserType,則只需編寫自己的UserType實現,這非常簡單。

Hibernate增強的類實際上可以是Serializable 但是,在使用這種方式之前,您應該考慮所有結果。 您可能會遇到這些問題:

  • 如果您的課程包含相關數據庫實體的集合,則會進行額外的查詢以加載這些實體
  • 如果您在類中具有雙向關系,則可能會遇到堆棧溢出
  • 為了防止這種行為,您將需要以某種方式指定序列化(例如,如果您序列化為JSON,則使用一些@Json*批注)
  • 如果您的班級僅包含ID,就可以了(但是您失去了很多Hibernate的優點)

要了解這些問題,您需要了解Hibernate的實際工作方式。

增強功能允許部分加載實體。 例如,您想獲取給定用戶的所有書籍。 您會得到一本書的集合,但是實際上所擁有的是一個休眠增強類的集合,這些目前僅包裝ID。 前提是您使用默認的延遲加載。

除非您確實需要ID以外的其他內容,否則永遠不會加載數據。 進行getter調用時,如有必要,將進行后台查詢以獲取額外的信息。

現在,想象一個用戶擁有他所有書集的一個字段。 從數據庫延遲加載時,可能什么也沒有。 但是,如果您要序列化它,則將調用所有獲取方法,並獲取所有書籍,並且如果所有書籍與它的作者有聯系,則傳遞每個書籍作者。

如果在類中該關系是雙向的,則您甚至可以創建一個周期,該周期將導致堆棧溢出錯誤,您可以在其中查找誰是這本書的所有者,然后再次為他取書。

暫無
暫無

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

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