【问题标题】:What is the best pattern to persist objects? [closed]持久化对象的最佳模式是什么? [关闭]
【发布时间】:2014-01-07 13:28:13
【问题描述】:

我需要持久化对象,并且我想让我的数据类尽可能干净。持久化的类没有任何业务逻辑代码,只有带有 getter/setter 的数据。

我目前正在使用观察者模式实施解决方案。每次修改 Observable 持久对象时,它都会向负责持久性的 Observer 对象发送一条消息。这样,持久对象的唯一约束是“可观察”。它可以保持清洁。

另一个解决方案(也许更好?)是实现一些 DAO 模式,我不太了解它的工作方式。也许它看起来像persistedObject.save();persistedObject.readById(id);。但这意味着我必须定义一些 DAO 接口,然后在每个持久化类中实现读取/创建/更新/删除方法

【问题讨论】:

  • 请澄清问题。您可以持久保存到文本文件、数据库、工业级云......除非您提供更多关于您的需求的背景知识,否则通常没有“最佳持久性”。你需要做什么?。
  • 目前,我的意图是使用 XML 序列化将对象持久化到文件中。但将来我也可能会使用数据库存储。这就是为什么我需要使用一些 CRUD 松散耦合模式来实现不同的存储访问方式(文件存储、数据库存储等......)
  • 如果你打算使用 XML 序列化,我建议使用 JAXB

标签: java design-patterns persistence dao


【解决方案1】:

这个问题有很多很多很多的答案,数据序列化或持久化是软件工程中的核心问题。选项包括使用数据库、内存映射文件、二进制和文本格式等等。

我个人最喜欢快速持久化对象的是GSON,但是您的用例将决定最适合您的方式。

您提到想要持久化 Java 对象的设计模式,虽然此类模式与库的数量一样多,但这里有几个一般性建议:

  • 使用不可变对象
  • 对不需要重构对象的任何字段使用 transient 关键字
  • 避免定义完整性检查或以其他方式限制对象中可接受值的范围 - 从反序列化调用构造的实例可能无法正确触发检查,从而允许构造可能无效的对象
  • 如果您需要更多的完整性检查,请使用您的可序列化对象来构造更复杂的对象,例如序列化一个StubPerson POJO,并拥有一个可以从StubPerson 构造的Person 对象,前提是存根的值有效

【讨论】:

  • 我的问题更多的是关于“我应该使用什么设计模式来持久化 java 对象”,但无论如何,你提到的库对我来说是答案的一部分:这正是我的那种干净的方法正在寻找,因为“Gson 可以处理任意 Java 对象,包括您没有源代码的预先存在的对象。”所以不需要专门的注解,也不需要从专门的类中继承。谢谢。
  • @DariusPaulsen - 我在回答中添加了一些建议,这就是您想要的吗?
【解决方案2】:

我不知道它是否适合您,但由于您只有 bean 类,您可以使用 Java persistence api

【讨论】:

  • 我看过这个,这可能是一种干净而有意义的做事方式,但就我而言,感觉它的目的太复杂了。我只需要一些创建/读取/更新/删除接口来访问我的数据,无论它们的存储方式如何(json 和 xml 文件,数据库......)我将不得不编写不同的适配器,但我可以那。无论如何,我的问题更多是关于如何实现适当的设计模式来持久化 java 对象。感谢您的回答。
【解决方案3】:

DAO 模式是管理数据访问和持久性的最佳模式,因为它专门为此而设计。

考虑到您的需求,您可能必须将它与一些工厂模式结合起来,以管理不同的实现(持久性适配器)。

我不知道您的要求,但如果您的应用程序可以被多人同时使用,您将不得不关心并发访问并定义策略(事务、锁定等...否则人们会覆盖数据彼此)。

关于您的问题,我建议JDO(以data nucleus 作为实现),但学习曲线对于您的有效需求而言可能过于昂贵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2010-10-11
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多