众所周知,出于原子性原因,hibernate 不允许在一个实体中使用多个eager-collections 。它发生了,因为它不能在一个查询中从不同的表中提取两个不同的集合。
问题: 但是当两个eager集合属于两个相同的层次结构树时,情况怎么样?有没有办法在同一个实体对象中实现两个eager-collection?
我怎么想这个:如果我们使用例如每类表继承策略并且两个集合属于这个层次结构,那么它们可以在一个请求中被提取(感谢union-operation)
答案 0 :(得分:2)
您可以获取多个集合,但要避免MultipleBagError
避免使用List
。
如果您的列表不超过1个,而其余的集合都是Set
,那么它应该可以正常工作。只需确保这些集合中使用的类具有良好的equals()和hashCode()方法。
更新以在评论中回答您的问题: 列表允许重复条目,集合不允许(只要正确实现了equals / hashCode)。
连接多个表的数据库查询会生成笛卡尔积(实际上代表您的单个实体的多行)。如果只有一个集合,那么Hibernate可以假设多行都属于该集合。如果有多个集合,则需要使用Set来自行管理,以避免重复。