【问题标题】:Serialization vs DB Storage序列化与数据库存储
【发布时间】:2015-06-29 02:53:57
【问题描述】:

我目前正在学习 Java 序列化。但是,我仍然对它的实用性感到困惑。一般来说,与直接将数据存储在各种数据库列中相比,我们应该在什么时候使用序列化?

【问题讨论】:

  • Java 序列化和数据库提供了解决同一问题的不同方法:使信息持久化。 Hibernate 不依赖于序列化(或者至少,如果你正确使用它,则不会),所以序列化不是“被照顾的”。
  • 我想说你最好谈谈 JPA-Java 持久化 API [hibernate、eclipselink、apache derby 等遵循的规则集!] 许多要持久化的类成员必须实现可序列化... stackoverflow.com/questions/2020904/…
  • 这里提到的一些 JPA 规范 stackoverflow.com/a/2021640/1897935 “如果一个实体实例作为一个分离的对象通过值传递(例如,通过远程接口),实体类必须实现 Serializable 接口。” => 如果类实现了它,那么所有字段也必须是可序列化的
  • @StephenC 嗯,那么休眠是如何持久化对象的呢?难道不需要使用ObjectOutputStream之类的东西,只是不告诉我们?
  • @SrinathGanesh - JPA 所说的是传递对象,而不是持久化它们。

标签: java hibernate serialization


【解决方案1】:

我认为您将序列化与读取对象和将对象写入数据库混淆了。

正如这个 SO 答案中所解释的 Do Hibernate table classes need to be Serializable? JPA 对象(休眠状态)应该实现 Serializable 以便可以通过 RMI 将分离的实体发送到应用程序的其他层。

这与 Hibernate 如何读取和写入数据到数据库无关。只要您不使用分离的对象,您就可以避免让您的实体实现Serializable,并且休眠仍然可以正常工作。

Hibernate 通过 JDBC 读取和写入数据库,就像您自己编写 SQL 查询一样。如果您想了解有关 hibernate 如何将对象字段转换为 JDBC 方法的更多信息,您可以从查看 Hibernate UserType 开始。 Hibernate 默认带有很多内置的用户类型,可以在数据库之间转换StringDateint 等类型的ResultSet 列。如果您需要编写自己的 UserTypes(偶尔发生),您只需要编写自己的 UserType 实现,这非常简单。

【讨论】:

  • 我对你的回答感到困惑。使用 JDBC 并不意味着不使用序列化。无论如何,我的问题并不是关于“将对象读取和写入数据库”。我只是想知道休眠如何将对象转换为可持久状态?我的意思很明显,它需要将对象转换为对数据库更友好的状态,然后才能将其保存到数据库中。
  • 它使用UserTypes,正如我解释的那样
  • 好的,我认为我缺乏知识正在阻止我目前完全理解这一点。在我回到这个线程之前,我会尝试做更多的研究。不过感谢您的宝贵时间。
【解决方案2】:

Hibernate 增强的类实际上可以是Serializable。但是,在以这种方式使用它之前,您应该考虑所有结果。你可能会遇到这些问题:

  • 如果您的类有相关数据库实体的集合,则会进行额外的查询来加载这些实体
  • 如果您在类中有双向关系,您可能会遇到堆栈溢出
  • 为防止这种行为,您需要以某种方式指定序列化(例如,如果您序列化为 JSON,则使用一些 @Json* 注释)
  • 如果你的类只包含 ID,你很好(但你失去了 Hibernate 的很多优点)

要了解这些问题,您需要了解 Hibernate 的实际工作原理。

增强功能允许实体部分加载。例如,您想获取给定用户的所有书籍。你得到了一堆书籍,但你真正拥有的是一个hibernate-enhanced classes的集合,它们目前只包装ID。前提是您使用默认的延迟加载。

除非您真的需要 ID 以外的其他内容,否则永远不会加载数据。在 getter 调用时,如果需要,会进行后台查询以获取额外信息。

现在,假设用户拥有他所有书籍的集合,作为一个字段。当从 DB 延迟加载时,可能什么都没有。然而,如果你想序列化它,所有的 getter 都被调用并且你得到所有的书,并且传递地,每个书的作者,如果书与其作者有关系...

如果类中的关系是双向的,您甚至可以创建一个会导致堆栈溢出错误的循环,您可以在其中查看谁是书的所有者,然后再次为他取书。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多