浏览 3667 次
锁定老帖子 主题:Session的delete方法
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-07-04
# // 假定customer是一个游离对象,先使它被Session关联,使它变为持久化对象, # # // 然后计划执行一个delete语句 # # session2.delete(customer); # # tx2.commit(); // 清理缓存,执行delete语句 # # session2.close(); // 从缓存中删除customer对象 这是精通Hibernate一书中 的一段代码,对应着它提到几遍的话: 值得注意的是,Session只有在清理缓存的时候的才执行delete语句。——————这句很OK 此外,只有当调用Session的close()方法时,才会从Session的缓存中删除该对象。——————这句作何解? 后者作何解?有啥用? 如果按照上述所说,那岂不是commit之后session.close()之前 我再load这个已经提交数据库的删除了的obj 还可以load到?这个不是有点荒唐么? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-08-19
我感觉应该是这样的:只有Session事务提交时,即执行commit时,才真正地执行了delete语句。在Session的Close方法时,才会清空缓存。《精通Hibernate》上有这几句话吗?第几页?我看看去。
|
|
返回顶楼 | |
发表时间:2012-08-20
最后修改:2012-08-20
1、session是一级缓存;
值得注意的是,Session只有在清理缓存的时候的才执行delete语句。 commit 会调用session的flush方法 刷出session中的数据到数据库,说白了就是同步session中数据到数据库并提交事务。 此外,只有当调用Session的close()方法时,才会从Session的缓存中删除该对象。——————PO(持久化对象)---->DO(托管对象) 我再load这个已经提交数据库的删除了的obj 还可以load到? load是延迟加载,,只有访问非主属性时才访问数据库进行加载; 可以看看这篇文章 http://sishuok.com/forum/blogPost/list/2477.html 还有建议你配合Hibernate官方文档的 《第 10 章 与对象共事》 一起学习,效果更佳: 引用 每间隔一段时间,Session会执行一些必需的SQL语句来把内存中的对象的状态同步到JDBC连接中。这个过程被称为刷出(flush),默认会在下面的时间点执行:
在某些查询执行之前 在调用org.hibernate.Transaction.commit()的时候 在调用Session.flush()的时候 涉及的SQL语句会按照下面的顺序发出执行: 所有对实体进行插入的语句,其顺序按照对象执行Session.save()的时间顺序 所有对实体进行更新的语句 所有进行集合删除的语句 所有对集合元素进行删除,更新或者插入的语句 所有进行集合插入的语句 所有对实体进行删除的语句,其顺序按照对象执行Session.delete()的时间顺序 (有一个例外是,如果对象使用native方式来生成ID(持久化标识)的话,它们一执行save就会被插入。) 除非你明确地发出了flush()指令,关于Session何时会执行这些JDBC调用是完全无法保证的,只能保证它们执行的前后顺序。 当然,Hibernate保证,Query.list(..)绝对不会返回已经失效的数据,也不会返回错误数据。 |
|
返回顶楼 | |
发表时间:2012-08-20
我发现没你不会的啊, 你是我的偶像!
jinnianshilongnian 写道 1、session是一级缓存;
值得注意的是,Session只有在清理缓存的时候的才执行delete语句。 commit 会调用session的flush方法 刷出session中的数据到数据库,说白了就是同步session中数据到数据库并提交事务。 此外,只有当调用Session的close()方法时,才会从Session的缓存中删除该对象。——————PO(持久化对象)---->DO(托管对象) 我再load这个已经提交数据库的删除了的obj 还可以load到? load是延迟加载,,只有访问非主属性时才访问数据库进行加载; 可以看看这篇文章 http://sishuok.com/forum/blogPost/list/2477.html 还有建议你配合Hibernate官方文档的 《第 10 章 与对象共事》 一起学习,效果更佳: 引用 每间隔一段时间,Session会执行一些必需的SQL语句来把内存中的对象的状态同步到JDBC连接中。这个过程被称为刷出(flush),默认会在下面的时间点执行:
在某些查询执行之前 在调用org.hibernate.Transaction.commit()的时候 在调用Session.flush()的时候 涉及的SQL语句会按照下面的顺序发出执行: 所有对实体进行插入的语句,其顺序按照对象执行Session.save()的时间顺序 所有对实体进行更新的语句 所有进行集合删除的语句 所有对集合元素进行删除,更新或者插入的语句 所有进行集合插入的语句 所有对实体进行删除的语句,其顺序按照对象执行Session.delete()的时间顺序 (有一个例外是,如果对象使用native方式来生成ID(持久化标识)的话,它们一执行save就会被插入。) 除非你明确地发出了flush()指令,关于Session何时会执行这些JDBC调用是完全无法保证的,只能保证它们执行的前后顺序。 当然,Hibernate保证,Query.list(..)绝对不会返回已经失效的数据,也不会返回错误数据。 |
|
返回顶楼 | |
发表时间:2012-08-24
额 这是我在另一处提的问题,有解了已经。
http://www.iteye.com/problems/85589 答案在采纳的答案的评论中。 |
|
返回顶楼 | |