无法获取多个包:为什么@IndexColumn返回错误的结果?

时间:2011-11-10 06:44:34

标签: java hibernate jpa

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

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

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;
(...)
}

映射是单向的。

好的,我已经google了,我可以使用IndexColumn注释来修复它。我已经实现了,如你所见,现在我没有得到提到的异常。但问题是,如果我想从db获取所有Managers,我会收到更多真正存在的管理器实例!

例如9个Manager实例,如果每个集合中只有1个管理器和3个子实例。我可以理解为什么会发生这种情况:Hibernate产生一个看起来像

的选择
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 

...它确实取得了比一行更多的行。

为什么会这样? 我该如何解决?

1 个答案:

答案 0 :(得分:0)

Hibernate生成笛卡尔积,在这种情况下不会重复数据删除。像这样的笛卡尔积(3个动作* 3个活动= 9行)只适用于集而不是列表。

即使有两套,你也应该避免使用这些笛卡尔产品。想一想:只检索一个具有100个操作的管理器,100个活动从数据库中检索10,000行。你应该提出两个问题:

  • 使用其操作(100行)获取经理的一个
  • 使用其活动(100行)获取同一经理的人

这只会产生200行而不是10,000行。结果将是相同的,因为活动将附加到会话中的同一个Manager实例。它还可以避免您遇到的重复问题。