谁能告诉我在Hibernate 中persist()vs 的优势是save()什么?
我试图了解Hibernate 3.6 session.get()和Hibernate 3.6的返回对象和行为的区别session.load().
来自javadoc:
得到():
返回给定实体类的持久实例和给定标识符,如果没有这样的持久实例,则返回null.(如果实例已与会话关联,则返回该实例.此方法永远不会返回未初始化的实例.)
加载():
假定实例存在,返回给定实体类的持久实例和给定标识符.当访问非标识符方法时,此方法可能会返回按需初始化的代理实例.
我有三个问题:
javadoc没有说什么时候load()可能会返回一个代理 - 有没有办法提前知道它?
当load()返回代理-这意味着load()没有访问数据库,对吗?那么如果我提供load()了数据库中不存在的标识符呢?我现在将在会话中拥有一个具有无效ID的代理(没有获得异常).现在我想让另一个持久化实例指向该代理 - 它会起作用吗?对于这种情况,我不需要初始化代理,我只需要它的id(即使它是无效的,因为它不在数据库中).所以我想我问的是我的描述是否正确,并且我总是需要load()在返回的对象之后签出,isInitialized()以确保它代表一个有效的实体(或至少是一个有效的代理),即具有有效的ID.
此外,如果load()返回代理会发生什么- 所以代理是已经与会话关联的实例.然后根据以下描述get():"如果实例已经与会话关联,则返回该实例." - 那么get()返回代理吗?因为根据以下描述get():"此方法永远不会返回未初始化的实例."
谢谢!
UPDATE
以下是否正确?
(A)我认为两者load()并get()会首先尝试才去DB检查会话缓存-所以它不会是正确的说,任何人总是打DB或总是返回的代理.
(B)初始化代理与原始实例不同,您可以在此处阅读:http://blog.xebia.com/2008/03/08/advanced-hibernate-proxy-pitfalls/
谁能告诉我这段代码有什么区别:
// This following method checks if there is an open session
// and if yes - returns it, if not - opens a new session.
Session session = getSession();
Query query = session.createQuery("from Entity e where e.id = 1");
Entity object = (Entity)query.uniqueResult();
Run Code Online (Sandbox Code Playgroud)
还有这个:
Session session = getSession();
Entity object = (Entity)session.load(Entity.class, new Integer(1));
Run Code Online (Sandbox Code Playgroud)
第一个方法是否返回代理对象?如果我再次调用它,它会打到数据库吗?
没有什么优势get有过createQuery?
我可以看到,不必解析HQL可能会有轻微的性能提升,但使用get over createQuery还有其他主要优势吗?