【问题标题】:Hibernate: more than one eager collections-properties that belongs to the same hierarchy treeHibernate:属于同一层次树的多个渴望集合-属性
【发布时间】:2013-08-03 19:59:49
【问题描述】:

众所周知,出于原子性原因,休眠不允许在一个实体中使用多个渴望集合。它发生了,因为它不能在一个查询中从不同的表中提取两个不同的集合。

问题: 但是当两个 eager-collection 属于两个相同的层次结构树的情况下呢?有什么办法可以在同一个实体对象中实现两个急切收集?

我是怎么想的:如果我们使用例如 table-per-class 继承策略并且两个集合属于这个层次结构,那么它们可以在一个请求中拉取(感谢联合操作) .

【问题讨论】:

  • 我不太确定您的问题是什么,但是如果您使用 JPQL 或 Criteria API 并定义要获取的这些关系 - 它们将在大多数数据库上的原子操作中获取。只要确保检查结果集的大小不会影响性能。
  • 我正在使用 Postgre。当我尝试声明多个急切获取的集合时 - MultipleBagError。
  • 正如你所说,新的 Hibernate 版本在急切获取时似乎具有 OneToMany 关系的功能。 OneToOne、ManyToOne 和 ManyToMany 关系仍然适用于 Eager fetch 类型。每个使用 fetch 类型急切声明的 OneToMany 关系都会使我的应用程序的部署崩溃。 (c) [community.jboss.org/thread/107685?tstart=0]

标签: hibernate jpa


【解决方案1】:

您可以获取多个集合,但要避免使用MultipleBagError,请避免使用List

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

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

连接多个表的数据库查询会产生笛卡尔积(实际上代表单个实体的多行)。如果只有一个集合,那么 Hibernate 可以假设多行都属于该集合。但是,如果有多个集合,则需要使用 Set 自己管理以避免重复。

【讨论】:

  • 谢谢。但我还是不明白:为什么 Set 允许,List 不允许?
猜你喜欢
  • 2015-03-29
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多