我想了解什么区别是在返回的对象和行为的休眠3.6 session.get()
和session.load()
。Hibernate 3.6 - session.get()vs session.load()
从javadoc:
get()方法:
返回与 指定的标识符,或者,如果不存在这样的持久化实例空给定的实体类的持久化实例。 (如果 的实例已经与会话相关联,返回 例如该方法不会返回一个未初始化的实例。)
负载():
返回的持久实例给定的实体类与给定的标识符 ,假设实例存在。当访问非标识符方法时,此方法可能会返回一个按需初始化的代理实例,其中 可能为 。
我有三个问题:
的Javadoc没有说明何时
load()
可能会返回一个代理 - 有没有办法知道它提前?当
load()
返回一个代理 - 这意味着load()
没有访问数据库,我是否正确?那么如果我提供了load()
的数据库中不存在的标识符呢?现在我将在会话中使用无效ID代理(无需获得例外)。现在我想让另一个持久实例指向那个代理 - 它会工作吗?对于这种情况,我不需要初始化代理,我只需要它的id(即使它是无效的,因为它不在数据库中)。所以我想我是问我的描述是否正确,我是否总是需要在load()
之后退回isInitialized()
返回的对象,以确保它代表一个有效的实体(或至少一个有效的代理),即有效的ID。此外,如果
load()
返回代理会发生什么 - 因此代理是已与该会话关联的实例。然后根据get()
的描述:“如果实例已经与会话关联,则返回该实例。” -get()
也会返回代理吗?由于根据get()
的描述:“此方法永远不会返回未初始化的实例。”
谢谢!
UPDATE
是以下是否正确?(A)我认为load()
和get()
将首先尝试检查会话高速缓存之前去DB - 所以它不会是正确的说,他们中的任何总是命中数据库,或总是返回一个代理。
(B)的初始化代理是不一样的原始实例,你可以在这里阅读:http://blog.xebia.com/2008/03/08/advanced-hibernate-proxy-pitfalls/
1。但是如果我在会话中已经有一个初始化的实例(对于这个ID),它是不是会返回该实例,而不是代理?此外,javadoc说:“这种方法可能会返回一个代理实例” - 它不会说“这个方法将永远”。 2.这是一种设计缺陷 - 因为根据你的说法,当我有一个代理,我想确保它代表一个实际的数据库中的数据库(我总是想确保 - 即使我只使用代理指向其他实例) - 然后我不知道我使用的ID是有效的,直到我初始化它,但在这种情况下,为什么使用代理? – rapt
3.你的意思是'load()'在'load()'后面会返回一个初始化的代理,或者只是一个初始化的实例?因为如果它是后者,那么我们现在在会话中有两个对象拥有相同的ID(代理和实例)。顺便说一句,我知道有可能有两个代理代表相同的数据库ID - 你可以在这里阅读:http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/在文本“其次,有可能破坏代理“。 - 在我的原始问题更多的更新。 – rapt
是的。你是对的。你的问题帮助我清除了一些关于'get()'和'load()'的误解。看到我的更新请 –