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

问题描述 投票:0回答:2

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

java hibernate spring-data-jpa
2个回答
0
投票

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


0
投票

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

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

首先,它们附属于会话。因此,在您关闭该会话后,它会变得短暂,并且尝试访问集合字段会抛出LazyInitializationException。即使您尝试在不同的新打开会话中访问集合字段(在此会话中不使其成为管理实体),情况也是如此。

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

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

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

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

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

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

  • 如果实体尚未存在于第一级缓存中,则它将从DB加载它,合并它并返回合并的实体
  • 如果实体已经存在,它将合并并返回合并的实体。
© www.soinside.com 2019 - 2024. All rights reserved.