【问题标题】:OneToMany + JoinTable + OrderColumn: Order is written correctly but not readOneToMany + JoinTable + OrderColumn:订单写入正确但未读取
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    尝试使用不依赖数据库的@OrderBy。您需要提供来自Group 的字段以进行排序(注意字段不是列)。

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

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

    有关更多信息,请查看我创建的关于 @OrderBy 的 blog post

    【讨论】:

      猜你喜欢
      • 2018-10-14
      • 2011-05-23
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多