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