SpringDataNeo4j-4:在 "owner" class 表示策略中的集合中存储实体(拥有的项目)
SpringDataNeo4j-4: storing entities(owned items) in collection inside "owner" class representation strategy
不幸的是,没有足够的信息以及演示在 Java 相关实体(如 "OWNER - OWNED ITEMS".
中表示的最佳方式的示例
我不是在谈论 neo4j 关系方向,而是在 java 保存此类实体时的数据表示和持久性行为。
Here 指南谈论持久性深度:
"...Also note that this behaviour is not dependent on any configured
relationship direction on the annotations. It is a matter of Java
references and is not related to the data model in the database."
我想了解在我的数据模型中选择什么策略。所以...
例如,我有一个 class "Task" 可以有很多子任务(相同类型)。任何任务都可以由 "Project" 拥有,并且可以是某些 "Component" 的成员...尽管如此,任务可以直接由项目拥有,并且根本不能与组件链接。
选项 1:
public class Project {
@Relationship(type = "HAS_TASK", direction = Relationship.OUTGOING)
private Set<Task> tasks = new HashSet<>();
@Relationship(type = "HAS_COMPONENT", direction = Relationship.OUTGOING)
private Set<Component> components = new HashSet<>();
}
public class Component {
@Relationship(type = "HAS_TASK", direction = Relationship.OUTGOING)
private Set<Task> tasks = new HashSet<>();
}
public class Task {
@Relationship(type = "HAS_SUBTASK", direction = Relationship.OUTGOING)
Set<Task> subtasks = new HashSet<>();
}
这似乎是最符合逻辑的数据表示。但似乎有缺点:
当创建新任务并调用 template.save(newTask) 时,只有新任务对象将被持久化并在该任务和项目之间创建关系,- 项目对象应该使用新保存的任务作为集合元素进行提取和更新。
所以,实际上,我们甚至不需要保存单独的 Task 对象。我们可以立即提取 Project 对象,将 Task 添加到集合并更新 Project...我觉得很奇怪...
当我们创建 Task 对象时,我们可以假设,然后 Project 甚至根本不存在,如果是这样 - 它不会被递归创建,因为 Task 对 Project 一无所知.. .
选项 2:
public class Project { }
public class Component {
private Project project;
}
public class Task {
private Task parentTask: // can be null
private Component component; // can be null
private Project project; // can be null
}
此模型允许创建新任务或新组件设置从数据库中提取现有项目(或设置新项目)并将它们都保存...而且我们确定,父对象和子对象将被持久化。
反馈:
看起来 "FOREIGN_KEY" 关系数据库中的链接...
我们有多余的 "null" 属性,例如,如果任务没有与某些项目或组件链接...
所以,我不知道该选择什么 - 两种解决方案都可以...但这不是关于工作,而是关于 "clean code"
一般准则是您的对象模型尽可能接近底层图形。
在图中,任务、项目和组件通过关系连接,这就是对象模型所表示的。
选项 2 看起来比选项 1 更接近您的图形模型,后者限制了可导航性。
这篇博客 post 有助于更好地解释这一点:http://graphaware.com/neo4j/2015/09/03/sdn-4-object-model.html
不幸的是,没有足够的信息以及演示在 Java 相关实体(如 "OWNER - OWNED ITEMS".
中表示的最佳方式的示例我不是在谈论 neo4j 关系方向,而是在 java 保存此类实体时的数据表示和持久性行为。 Here 指南谈论持久性深度:
"...Also note that this behaviour is not dependent on any configured relationship direction on the annotations. It is a matter of Java references and is not related to the data model in the database."
我想了解在我的数据模型中选择什么策略。所以...
例如,我有一个 class "Task" 可以有很多子任务(相同类型)。任何任务都可以由 "Project" 拥有,并且可以是某些 "Component" 的成员...尽管如此,任务可以直接由项目拥有,并且根本不能与组件链接。
选项 1:
public class Project {
@Relationship(type = "HAS_TASK", direction = Relationship.OUTGOING)
private Set<Task> tasks = new HashSet<>();
@Relationship(type = "HAS_COMPONENT", direction = Relationship.OUTGOING)
private Set<Component> components = new HashSet<>();
}
public class Component {
@Relationship(type = "HAS_TASK", direction = Relationship.OUTGOING)
private Set<Task> tasks = new HashSet<>();
}
public class Task {
@Relationship(type = "HAS_SUBTASK", direction = Relationship.OUTGOING)
Set<Task> subtasks = new HashSet<>();
}
这似乎是最符合逻辑的数据表示。但似乎有缺点:
当创建新任务并调用 template.save(newTask) 时,只有新任务对象将被持久化并在该任务和项目之间创建关系,- 项目对象应该使用新保存的任务作为集合元素进行提取和更新。 所以,实际上,我们甚至不需要保存单独的 Task 对象。我们可以立即提取 Project 对象,将 Task 添加到集合并更新 Project...我觉得很奇怪...
当我们创建 Task 对象时,我们可以假设,然后 Project 甚至根本不存在,如果是这样 - 它不会被递归创建,因为 Task 对 Project 一无所知.. .
选项 2:
public class Project { }
public class Component {
private Project project;
}
public class Task {
private Task parentTask: // can be null
private Component component; // can be null
private Project project; // can be null
}
此模型允许创建新任务或新组件设置从数据库中提取现有项目(或设置新项目)并将它们都保存...而且我们确定,父对象和子对象将被持久化。
反馈:
看起来 "FOREIGN_KEY" 关系数据库中的链接...
我们有多余的 "null" 属性,例如,如果任务没有与某些项目或组件链接...
所以,我不知道该选择什么 - 两种解决方案都可以...但这不是关于工作,而是关于 "clean code"
一般准则是您的对象模型尽可能接近底层图形。
在图中,任务、项目和组件通过关系连接,这就是对象模型所表示的。
选项 2 看起来比选项 1 更接近您的图形模型,后者限制了可导航性。
这篇博客 post 有助于更好地解释这一点:http://graphaware.com/neo4j/2015/09/03/sdn-4-object-model.html