使用Hibernate

时间:2015-11-03 19:53:04

标签: java hibernate

我有一个与Parent实体有@OneToMany关系的Child实体。大多数情况下,当我需要使用Parent的{​​{1}}实体时,我正在使用单个父级,因此延迟提取(Child)是合适的。

但是,我遇到的情况是我要查询大量的FetchMode.SELECT(有时数百甚至数千),我需要使用他们的Parent实体。 Child给了我一个严重的N + 1问题,因此我需要在这种情况下做一些不同的事情。如果我是通过JDBC执行此操作,那么它将是FetchMode.SELECT个记录的单个查询,然后使用Parent语句(Child语句对所有IN个记录进行另一个查询。我需要实时的Hibernate实体,因为Hibernate Search将调用getChildren()作为其索引过程的一部分。

我考虑的选项是:

  1. where child.parentid in (?,?,?....)(或HQL中的Criteria.setFetchMode(“children”, FetchMode.JOIN)) - 这会给我一个笛卡尔积,但这对许多实体来说是残酷的。
  2. join fetch添加到@BatchSize - 这对我的大批量方案有帮助,但它并不是我想要用于正常操作的策略。如果我可以在Criteria / HQL中为fetch设置批量大小,那将是完美的,但我找不到这样做的方法。
  3. Parent.getChildren()中使用FetchMode.SUBSELECT - 与Parent.getChildren()非常相似,这对我的大批量方案来说非常有用,但不适合正常操作,我找不到使用Criteria / HQL的方式(条件和实体注释使用不同的FetchMode枚举,尽管名称重复)。
  4. tldr;我与懒惰的获取模式有一对多的关系,但有时我希望能够一次有效地加载许多实体的关系。

0 个答案:

没有答案