Hibernate:属于同一层次结构树的多个急切集合属性

Hibernate:属于同一层次结构树的多个急切集合属性,hibernate,jpa,Hibernate,Jpa,众所周知,由于原子性的原因,hibernate不允许在一个实体中使用多个急切的集合。这种情况会发生,因为它不能在一个查询中从不同的表中提取两个不同的集合 问题:但当两个急切的集合属于同一层次结构树时,情况会怎样?有没有办法在同一个实体对象中实现两个急切的集合 我是如何想象的:例如,如果我们使用每类表继承策略,并且两个集合属于此层次结构,那么它们可以在一个请求中被提取出来(感谢联合操作)。您可以提取多个集合,但要避免出现多重错误避免使用列表 如果您的列表不超过1个,而其余的集合都是Sets,那么它

众所周知,由于原子性的原因,hibernate不允许在一个实体中使用多个急切的集合。这种情况会发生,因为它不能在一个查询中从不同的表中提取两个不同的集合

问题:但当两个急切的集合属于同一层次结构树时,情况会怎样?有没有办法在同一个实体对象中实现两个急切的集合


我是如何想象的:例如,如果我们使用每类表继承策略,并且两个集合属于此层次结构,那么它们可以在一个请求中被提取出来(感谢联合操作)。

您可以提取多个集合,但要避免出现
多重错误
避免使用
列表

如果您的列表不超过1个,而其余的集合都是
Set
s,那么它应该可以工作。只需确保这些集合中使用的类具有良好的equals()和hashCode()方法

更新以回答评论中的问题: 列表允许重复条目,而集合不允许(只要正确实现了equals/hashCode)


连接多个表的数据库查询生成笛卡尔乘积(实际表示单个实体的多行)。如果只有一个集合,那么Hibernate可以假定多行都属于该集合。但是,如果有多个集合,您需要通过使用集合来管理,以避免重复。

您可以获取多个集合,但要避免出现
多个集合错误
请避免使用
列表

如果您的列表不超过1个,而其余的集合都是
Set
s,那么它应该可以工作。只需确保这些集合中使用的类具有良好的equals()和hashCode()方法

更新以回答评论中的问题: 列表允许重复条目,而集合不允许(只要正确实现了equals/hashCode)


连接多个表的数据库查询生成笛卡尔乘积(实际表示单个实体的多行)。如果只有一个集合,那么Hibernate可以假定多行都属于该集合。但是,如果有多个集合,您需要通过使用集合来管理它们,以避免重复。

我不太确定您的问题是什么,但是如果您使用JPQL或Criteria API并定义要获取的关系,它们将在大多数数据库上的原子操作中获取。请确保检查结果集的大小不会影响性能。我正在使用Postgre。当我试图声明多个急切获取的集合时——MultipleBagError。正如你所说的,新的Hibernate版本似乎有一个特性,即当它们急切获取时,具有一对一关系。OneToOne、ManyToOne和ManyToMany关系仍然适用于急切获取类型。使用fetch类型声明的每个OneToMany关系都会导致应用程序的部署崩溃。(c)[我不太确定您的问题是什么,但如果您使用JPQL或Criteria API并定义要获取的关系,它们将在大多数数据库上的原子操作中获取。只需确保检查resultset的大小不会影响性能。我使用的是Postgre。当我尝试声明多个急切获取的集合时,请正如你所说的,新的Hibernate版本在抓取时似乎有一个特性,即OneToName关系。OneToOne、ManyToOne和ManyToMany关系在抓取类型为“急切”时仍然可以正常工作。每个用抓取类型“急切”声明的OneToMany关系都会导致我的应用程序部署崩溃。(c)[谢谢。但我还是不能理解:为什么它可以放在集合中,而不是列表中?谢谢。但我还是不能理解:为什么它可以放在集合中,而不是列表中?