【问题标题】:how hibernate manage serialization id while saving/fetching object in/from DBhibernate 如何在数据库中保存/获取对象时管理序列化 ID
【发布时间】:2013-06-25 04:35:31
【问题描述】:

根据我对管理一致性序列化算法的理解,在从流中保存/获取对象时,在类中维护一个序列化 ID 为private static final long serialVersionUID = 3170588813843556321L;。并且该 ID 将保存在该文件/流中。

但是使用 DB 而我们根本没有将它保存在 DB 中,那么休眠如何在反序列化期间检查一致性并抛出 java.io.InvalidClassException

如果我的理解有误,请纠正我......

【问题讨论】:

    标签: java database hibernate serialization


    【解决方案1】:

    hibernate 不使用序列化将您的类存储到数据库中。它通过object relational mapping 工作,并且(简单地)将对象的每个属性映射到表中的列。 仅当您具有特定类型的属性(例如public Image getImage())时,它才会存储“真实”二进制文件 - 它可能将此属性映射到 blob 以使用序列化/反序列化来存储/加载映射类的图像属性。

    在 hibernate 中检查数据一致性可以通过显式锁定(只要您的实体正在使用,它就会锁定构成您的实体的行)或通过optimistic locking - 它会添加一个“版本”字段到您的实体,每次修改实体时更新它,并使用 "update table set ... where version=:myVersion" 形式的 sql 以确保没有 2 个进程同时修改同一个实体。

    【讨论】:

    • 我不是在谈论 hibernate 的锁管理,它基本上用于并发访问/修改,这是关于serialVersionUID,我们在使用 Hibernate 时必须在每个 DTO 中维护它。 ............. 因此,如果 hibernate 不关心序列化,那么为什么必须强制为 DTO 实现 java.io.Serializable
    • DTO 和休眠 (JPA) 类不必相同。 DTO 通常是传递的,有时是远程发送的,因此必须是可序列化的。 JPA 实体只是存储到 DB 并从中读取(当然同一个类可以是两者)。还有 - 它的 RECOMMENDED 您设置了一个明确的串行 UID。你不必。
    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2016-08-11
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多