Hibernate在SessionFactory创建期间抛出此异常:
org.hibernate.loader.MultipleBagFetchException:无法同时获取多个行李
这是我的测试用例:
Parent.java
@Entity
public Parent {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
// @IndexColumn(name="INDEX_COL") if I had this the problem solve but I retrieve more children than I have, one child is null.
private List<Child> children;
}
Run Code Online (Sandbox Code Playgroud)
Child.java
@Entity
public Child {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@ManyToOne
private Parent parent;
}
Run Code Online (Sandbox Code Playgroud)
这个问题怎么样?我能做什么?
编辑
好吧,我遇到的问题是另一个"父"实体在我父母的内部,我的真实行为是这样的:
Parent.java
@Entity
public Parent {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@ManyToOne
private AntoherParent anotherParent;
@OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
private List<Child> children;
}
Run Code Online (Sandbox Code Playgroud)
AnotherParent.java
@Entity …Run Code Online (Sandbox Code Playgroud) 如果我使用,有什么不同
@OneToMany
public Set<Rating> ratings;
Run Code Online (Sandbox Code Playgroud)
或者如果我使用
@OneToMany
public List<Rating> ratings;
Run Code Online (Sandbox Code Playgroud)
两者都工作正常,我知道列表和集合之间的区别,但我不知道这有什么不同,如何hibernate(或更确切地说JPA 2.0)处理它.
我曾尝试在 Stack Overflow 和其他网站上搜索使用Sets与Lists的优点、缺点和便利,但我真的找不到关于何时使用这个或那个的明确答案。
从 Hibernate 的文档中,他们指出非重复记录应该进入Sets,从那里,你应该为每个可以包装到Set 的单个实体实现你的 hashCode() 和 equals() 。但随后谈到了便利性和易用性的代价,因为有一些文章推荐使用业务键作为每个实体的 id,从那里开始,hashCode() 和 equals() 可以在每种情况下完美实现无论对象的状态如何(托管、分离等)。
一切都很好,一切都很好……直到我遇到很多使用Sets不可行的情况,例如排序(尽管 Hibernate 为您提供了SortedSet的想法),collectionObj.get(index) 的便利性, collectionObj.remove(int location || Object obj)、Android 的 ListView/ExpandableListView 架构(GroupIds、ChildIds)等等……我的观点是:集合真的很糟糕(恕我直言)操作并使其 100% 工作。
我很想将我项目的每个集合都更改为List,因为它们运行良好。我所有实体的 ID 都是通过 MYSQL 的自动生成序列 ( @GeneratedValue(strategy = GenerationType.IDENTITY))生成的。
有没有人可以在上面提到的所有这些小细节中以明确的方式清除我的想法?
另外,是否可以将 Eclipse 自动生成的 hashCode() 和 equals() 用于每个实体的 ID 字段?它会在所有情况下都有效吗?
非常感谢,
雷纳托