伙计们,请帮助我解决以下问题。
我遇到了着名的“无法同时获取多个行李”错误,因为我的父实体中有两个列表。这是一段代码:
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
...它确实取得了比一行更多的行。
为什么会这样? 我该如何解决?
答案 0 :(得分:0)
Hibernate生成笛卡尔积,在这种情况下不会重复数据删除。像这样的笛卡尔积(3个动作* 3个活动= 9行)只适用于集而不是列表。
即使有两套,你也应该避免使用这些笛卡尔产品。想一想:只检索一个具有100个操作的管理器,100个活动从数据库中检索10,000行。你应该提出两个问题:
这只会产生200行而不是10,000行。结果将是相同的,因为活动将附加到会话中的同一个Manager实例。它还可以避免您遇到的重复问题。