Java 无法提取多个行李:为什么@IndexColumn返回错误的结果?

Java 无法提取多个行李:为什么@IndexColumn返回错误的结果?,java,hibernate,jpa,Java,Hibernate,Jpa,伙计们,请帮我解决以下问题 我遇到了著名的“无法同时获取多个包”错误,因为我的父实体中有两个列表。下面是一段代码: class Manager{ @OneToMany(cascade = CascadeType.ALL) @Fetch(FetchMode.JOIN) @IndexColumn(name = "id") private List<Action> actions; @OneToMany(cascade = CascadeType.

伙计们,请帮我解决以下问题

我遇到了著名的“无法同时获取多个包”错误,因为我的父实体中有两个列表。下面是一段代码:

class Manager{
    @OneToMany(cascade = CascadeType.ALL)
    @Fetch(FetchMode.JOIN)
    @IndexColumn(name = "id")
    private List<Action> actions;

    @OneToMany(cascade = CascadeType.ALL)
    @Fetch(FetchMode.JOIN)
    @IndexColumn(name = "id")
    private List<Activity> activities;
(...)
}
。。。而且它真的获取了不止一行的数据

为什么会发生这种情况?
如何修复它?

Hibernate生成笛卡尔乘积,在这种情况下不去复性。像这样的笛卡尔产品(3个动作*3个活动=9行)只适用于集合而不是列表

即使有两个集合,也应该避免使用这类笛卡尔积。想想看:仅检索一个具有100个操作和100个活动的管理器,就可以从数据库中检索10000行。您或许应该提出两个问题:

  • 获取管理器及其操作的一个(100行)
  • 获取同一管理器及其活动的管理器(100行)
这将使只有200行而不是10000行。结果将是相同的,因为活动将附加到会话中的同一个Manager实例。它还可以避免您遇到的复制问题。

谢谢,JB Nizet!(1) 但是,您能解释一下Hibernate在哪些情况下能够以正确的方式处理多行吗?(2) 第二个问题是:为什么您认为额外的行比额外的查询更糟糕?
select ... from Manager this_ 
left outer join manager_action actions3_ on this_.id=actions3_.Manager_id 
left outer join Action action4_ on actions3_.actions_id=action4_.id 
left outer join Manager_Activity activities5_ on this_.id=activities5_.Manager_id 
left outer join Activity activity6_ on activities5_.activities_id=activity6_.id