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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否将Lazily提取的对象附加到Hibernate会话(由Hibernate支持的Spring Data)?相关的知识,希望对你有一定的参考价值。

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

答案

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

另一答案

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

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

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

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

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

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

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

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

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

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

以上是关于是否将Lazily提取的对象附加到Hibernate会话(由Hibernate支持的Spring Data)?的主要内容,如果未能解决你的问题,请参考以下文章

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role

无法快速将对象附加到对象数组

无法将 Apache Commons FileUpload 与 Spring Boot multipart.resolve-lazily 一起使用

将数据 URI 转换为文件,然后附加到 FormData

将提取的列附加到没有索引的列表中:Pandas

将 Vue 对象附加到元素的最推荐语法是啥?