1

我正在开发一个带有一些 POJO 类的 J2SE 桌面应用程序,这些 POJO 类使用 ArrayLists 表示数据和它们之间的一对多/多对多关系。我没有使用 ORM,只是使用 Collections 管理数据并使用 Java 的 PropertyChangeListener 来触发模型事件以保持模型解耦(来自 Python 背景,DAO 模式所需的重复量和样板代码似乎很难编写和维护)。

所以为了在这个应用程序中保存文件,我最初使用了序列化。这当然是一个糟糕的决定,因为对软件域对象的更新破坏了与以前保存的文件的向后兼容性。

然后我决定转移到 JAX-B,但看看这个虚构的输出:

<Person>
  <Todo>
    <title>Task 1</title>
  </Todo>
</Person>

<Category>
  <title>Category 1</title>
  <Todo>
    <title>Task 1</title>
  </Todo>
</Category>

我现在无法发现Todo来自 Person 的 Todo 与来自 Category 的 Todo 相同。我想我可以添加一个id字段并跟踪最大 id 作为模型上的静态变量,但这似乎是很多样板文件,并且可以通过按 ID 搜索来填充集合。

是否有解决此类问题的标准方法,以及 Java 社区中最广泛的解决方案是什么。

4

2 回答 2

1

没有“标准”的方式来做到这一点。但是您可能要考虑的一个选项是将您的对象序列化为 JSON。然后,您可以将 JSON 存储到文件中,或者存储到 Redis 等小型键值存储中。JSON的一些优点?

  • 相当紧凑的格式,特别是在保存之前压缩时。
  • 易于解析,具有大量可用的现有库来完成这项工作
  • 相当容易转发因素(例如,在您的域模型发生变化的情况下)
  • 人类可读。

并且一些 JSON 库(如 Jackson 2+)可以跟踪对象身份,使数据重复成为非因素。

于 2013-01-14T02:22:14.043 回答
0

您可以在 XML 中添加 3 行来定义关系。

<Person>
  <title>Person 1</title>
  <Todo>
    <title>Task 1
      <category>Category 1</category
    </title>
  </Todo>
</Person>

<Category>
  <title>Category 1</title>
  <Todo>
    <title>Task 1
      <person>Person 1</person>
    </title>
  </Todo>
</Category>
于 2013-01-14T02:02:15.967 回答