是否将Lazily提取的对象附加到Hibernate会话(由Hibernate支持的Spring Data)?

时间:2018-04-05 10:03:44

标签: java hibernate spring-data-jpa

问题是:如果我有一个实体,其中包含一个延迟获取的OneToMany集合字段,并且我从数据库中获取它,让我们说它的ID,是否也附加到会话的惰性集合的元素?因此,如果我尝试向DB查询作为延迟集合的元素的实体,Hibernate将返回缓存的实例,如果我尝试将具有相同ID的瞬态实体附加到该会话,我将获得EntityExistsException?< / p>

2 个答案:

答案 0 :(得分:0)

是。它们被懒惰加载并没有什么区别,只要加载被触发,它们也将被管理对象(如果它们已经在第一级缓存中,它们将从那里取而代之而不是数据库)。

答案 1 :(得分:0)

  

如果我有一个实体,其中包含一个懒惰的OneToMany集合字段并且我从数据库中获取它,比如说它的ID,是否也附加到会话的惰性集合的元素?

我相信你的问题更多,我可以在以后的不同会话中加载延迟集合。

首先,它们被附加到会话中。因此,在您关闭该会话后,它会变得短暂,并且尝试访问集合字段会抛出LazyInitializationException。即使您尝试在另一个新的打开会话中访问集合字段(在此会话中不将其设置为托管实体),情况也是如此。

因此,如果想要在另一个新会话中访问/填充延迟集合,则需要通过调用say merge方法来管理此实体,然后您可以在此新会话中访问延迟集合。

  

因此,如果我尝试向DB查询作为该元素的实体   懒惰的集合,Hibernate将返回缓存的实例

如果它在同一个会话中,hibernate会从它的第一级缓存返回它,如果它已经存在,否则将激活查询到DB并将其放在第一级缓存中并用于后续查询。

如果在不同的会话中,它是不同的第一级缓存,因此向DB发出查询。第一级缓存是特定于会话的,不会在会话之间共享。

  

如果我尝试将具有相同ID的瞬态实体附加到该会话I   会得到EntityExistsException吗?

我认为你指的是在分离的现有实体上调用merge方法 - 当你说attach a transient entity with the same ID -

  • 如果实体尚未存在于第一级缓存中,它将从数据库加载它,合并它并返回合并后的实体
  • 如果实体已经存在,它将合并并返回合并的实体。