渴望使用多个选项进行提取,但不使用FetchType.EAGER注释

时间:2017-01-04 00:27:55

标签: hibernate jpa fetch eager-loading entitygraph

我想在某些用例中急切地获取一对多List - s(但并非总是如此,因此@OneToMany(fetch=FetchType.EAGER)不会很好),而且我也想要JPA使用单独的SQL选择来获取那些List - s(每List一个选择,而不是每个List项一个),而不是SQL连接。那是因为笛卡儿的产品(我有两个独立的清单)。

您可能认为我可以使用JPA 2.1实体图表(毕竟它是什么,将标记属性视为特定方式)或不太优雅left join fetch使用JPQL(或使用标准API)。但是这些似乎坚持使用SQL连接(在left join fetch的情况下并不奇怪),即使这样他们最终得到MultipleBagFetchException,他们也不会退回到获取一些List - s在单独的SQL选择中。实际上我的案例也是一个多包箱,但在你重定向我用Set - s等工作之前,请注意前提是我不想加入(太大的笛卡儿)产品)。现在,只是为了取笑我,如果我使用List注释@OneToMany(fetch=FetchType.EAGER)属性,Hibernate会足够智能地在单独的选择中获取List - s以避免多个包(加上我甚至可以使用Hibernate的Fetch注释强制执行此行为。因此,似乎JPA 2.1实体图未能实现ad-hoc FetchType.EAGER的承诺,因为它们的行为与ad-hoc fetch join相似,我们之前已经有过它们。或者我错过了什么?

我突然想到,我应该在初始查询后调用parentEntity.getSomeList().size(),这次不会尝试获取列表,但问题是,我还需要急切地获取一些属性。列出项目本身,我无法为上述调用指定实体图表。我也可以自己创建一个JPA查询,它只能获得" someList"用急切的提取(没问题),但是如何将结果列表放回parentEntity?如果我调用parentEntity.setSomeList(fetchedList)parentEntity变脏(尽管它不在关联的所有者一侧),所以它将是SQL update-d(仅限破坏最后一次修改)时间和乐观锁定版本。)

1 个答案:

答案 0 :(得分:0)

另一种方法是将同一个表映射到两个不同的实体中。因此,当您需要具有多个选择的EAGER行为时,您可以将实体用于:

Run command: ./hello-world
Child pid: 53209
Run command: ./hello-world
Child pid: 53210
...

当你想要懒惰时,你可以使用另一个实体:

@Fetch(FetchMode.SELECT)
@ManyToOne(fetch = FetchType.EAGER)