【发布时间】:2013-05-06 09:22:02
【问题描述】:
我有一个可以由它自己组成的实体:
class Group {
// ...
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(
name = "group_group",
joinColumns = @JoinColumn(name = "id"),
inverseJoinColumns = @JoinColumn(name = "parentgroup_id")
)
@OrderColumn
private List<Group> groups = new ArrayList<Group>();
@ManyToOne
private Group parentGroup;
public List<Group> getGroups() {
return groups;
}
public Group getGroup() {
return parentGroup;
}
}
我可以创建一个组并添加两个子组:
Group parent = new Group();
Group child1 = new Group();
Group child2 = new Group();
parent.getGroups().add(child1);
parent.getGroups().add(child2);
parent = groupRepository.save(parent);
// parent.getGroups().get(0).getId() == child1.getId()
// parent.getGroups().get(1).getId() == child2.getId()
但这似乎是一个巧合。我能够更新顺序(例如,使用 Collections.sort)并且连接表行已正确更新。
无论我如何加载父组,子组始终按创建顺序排列。执行的 SQL 查询为:
SELECT t1.ID, t1.PARENTGROUP_ID FROM GROUP t0, GROUP t1 WHERE ((t1.PARENTGROUP_ID = ?) AND (t0.ID = t1.PARENTGROUP_ID))
没有 ORDER BY 似乎是错误的。如何说服 EclipseLink 添加它?
【问题讨论】:
-
您显示的 SQL 语句不适用于您使用 OrderColumn 为 OneToMany 映射定义的“group_group”连接表。默认情况下它是惰性的,因此请尝试访问组关系并显示生成的 SQL。请注意,仅在从数据库中读取集合时才会对集合进行排序。一旦实体被缓存,您必须维护应用程序中的顺序或强制刷新父实体以从数据库重新加载集合。
-
这是我日志中出现的唯一一条 SQL 语句。
标签: eclipselink spring-data-jpa jointable