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