问题是:如果我有一个实体,其中包含一个懒惰的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
时 -