为什么hibernate强制在session.get方法中进行序列化

Red*_*ddy 5 java hibernate

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

根据我对hibernate的理解,它将生成一个SQL语句并将其发送给DBMS.它永远不需要通过网络发送java对象.

为什么hibernate强制对我们进行序列化?

Pas*_*ent 5

首先,Hibernate Serializable在某些签名中使用的事实并不意味着Hibernate 序列化任何东西,它只是意味着如果需要,参数是可序列化的.

然后,我找不到绝对的参考,但我认为最强的论点是:

  • 实体ID用作缓存的密钥(第一级,第二级),并且可以通过网络发送

一些较弱的参数(或根本不参数):

  • Session本身可被潜在地串行化(例如,以被存储在HttpSession)
  • Hibernate需要一个超类型entityId(包括复合PK)

考虑到所有这些,我认为强制API的用户通过a是有意义的Serializable entityId,这允许不关闭任何门并避免任何后期限制(oops,你不能激活二级缓存,因为这不是pk Serializable).这是IMO比使用更好的设计决策Object.说实话,我没有看到任何烦恼.


per*_*ian 0

我认为这是因为对缓存的支持。当使用持久缓存或任何通过网络分发对象的缓存时,您需要有一种方法来确保对象可以以通用格式(在本例中为 Java 序列化)传输。