序列化与数据库存储

时间:2015-06-29 02:53:58

标签: java hibernate serialization

我目前正在研究Java序列化。但是,我仍然对其实用性感到困惑。一般来说,与直接在各种数据库列中存储数据相比,我们何时应该使用序列化?

2 个答案:

答案 0 :(得分:3)

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

正如本回答中所解释的那样Do Hibernate table classes need to be Serializable? JPA对象(hibernate)应该实现Serializable,以便可以通过RMI将分离的实体发送到应用程序的其他层。

这与Hibernate如何读取和写入数据库数据无关。只要你不使用分离的对象,你就可以在没有实体实现Serializable的情况下逃脱,而hibernate仍然可以正常工作。

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

答案 1 :(得分:1)

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

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

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

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

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

现在,假设一个用户拥有他所有书籍的集合,作为一个字段。当从DB延迟加载时,可能根本没有任何东西。但是,如果你想序列化它,所有的getter都被称为,如果书籍与其作者有关系,你会得到所有书籍和传递,每本书的作者...

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