OneToMany + JoinTable + OrderColumn:订单正确写入但未读取

时间:2013-05-06 09:22:03

标签: eclipselink spring-data-jpa jointable

我有一个可以自己组成的实体:

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添加它?

2 个答案:

答案 0 :(得分:1)

问题是我尝试使用CrudRepository加载子组实体。存储库忽略@OrderColumn注释。我通过获取父组并使用getGroups()来修复它。

答案 1 :(得分:0)

尝试使用不依赖于数据库的@OrderBy。您需要提供从Group订购的字段(注意字段而不是列)。

@OrderBy("fieldNameGoesHere DESC")
private List<Group> groups = new ArrayList<Group>();

OrderColumn将维护数据库中列表的顺序,这会带来额外的性能和维护开销。 OrderBy将持久性提供程序的责任放在维护实体的顺序上,但是顺序不会在持久性上下文中持续存在。

有关详细信息,请查看我创建的有关@OrderBy的blog post