【问题标题】:How to persist an object which has nested list of objects如何持久化具有嵌套对象列表的对象
【发布时间】:2018-03-17 01:12:20
【问题描述】:

我正在尝试用 Java 创建一个任务列表应用程序,其中的任务可以有相关的任务。因此,任务类如下所示:

public class Task implements Serializable {

private static final long serialVersionUID = -5372927338757312018L;
private long id;
private String title;
private String description;
private Task parent;
private Set<Task> children;

任务被持久化到 postgres。目前有 2 个表:

tasks 表:id、title、description
parent_child 表:parent_id、child_id

为了反序列化,我检索有问题的任务,构造对象,然后检索每个依赖/子任务,构造它们,并将它们作为子任务添加到原始任务中。挑战在于每个子任务都可以有自己的依赖/子任务。

检索任务(以及它是否有任何子任务):

SELECT id, title, description, start, due, totalhours, completedhours,

(SELECT 
  COUNT(*)
  FROM todo.parent_child 
  WHERE todo.parent_child.parent_id = '201'
  ) AS child_count

FROM todo.tasks 
WHERE id = '201'
GROUP BY id, title, description, start, due, totalhours, completedhours;

如果 child_count 大于 0,我会跟进其他查询以检索依赖/子任务。

这一切都是可行的,但是是否有更好的方法来建模和/或持久化任务?更一般地,应该如何对具有嵌套对象列表的对象进行持久化和重构?

【问题讨论】:

  • 不确定否决票,因为没有添加 cmets。如果我可以做些什么来改善这个问题,请告诉我。
  • 你可以使用像 Hibernate 这样的 ORM 来完成持久化工作。如果你不能/不想使用这样的框架,你可以为列表中的每个任务递归调用加载任务方法。
  • 谢谢 Michal,看起来 ORM 就是答案。我是数据方面的新手,所以这提供了很多选择(并回答了我的问题)。

标签: java sql postgresql


【解决方案1】:

正如我在评论中所写,您可以使用一些 ORM,例如 Hibernate。在另一种情况下,您可以编写这样的递归方法:

Task loadTaskWithChildren(long taskId) {
  Task task = loadSingleTaskFromDb(taskId);
  for(long childId : getChildrenIds(taskId))
    task.addChild(loadTaskWithChildren(childId);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多