hibernate中session.delete()的问题

computerlibin 2011-09-22 11:32:47
这几天准备找工作,复习了一下hibernate,但是在复习缓存时遇到了如下问题,哪位高手能帮我解答一下?

第一个例子:
User user=(User)session.get(User.class, "3");//将id为3的user对象加入到session缓存中
session.delete(user);//这句代码对session结构来说执行了哪些操作?
user=(User)session.get(User.class, "3");//这里为什么没有发出sql语句,是因为session缓存中还有id为3的user对象吗?

第二个例子:
User user=(User)session.get(User.class, "3");//将id为3的user对象加入到session缓存中
session.delete(user);
session.flush();////这句代码对session结构来说执行了哪些操作?
user=(User)session.get(User.class, "3");//这里为什么发出了sql语句?
...全文
287 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
computerlibin 2011-09-26
  • 打赏
  • 举报
回复
这个我已经改过了[Quote=引用 17 楼 chenweihua419 的回复:]

show_sql在hibernate.cfg.xml配置文件中,看一下hibernate的参考文档,其中就有show_sql会把对数据库的操作代码在控制台中显示出来。
[/Quote]
computerlibin 2011-09-24
  • 打赏
  • 举报
回复
谢谢,谢谢[Quote=引用 15 楼 romantic_pk 的回复:]

继续围观!!友情帮顶!
[/Quote]
romanitc 2011-09-24
  • 打赏
  • 举报
回复
继续围观!!友情帮顶!
chenweihua419 2011-09-24
  • 打赏
  • 举报
回复
show_sql在hibernate.cfg.xml配置文件中,看一下hibernate的参考文档,其中就有show_sql会把对数据库的操作代码在控制台中显示出来。
computerlibin 2011-09-24
  • 打赏
  • 举报
回复
session = factory.openSession();
session.beginTransaction();
User user=(User)session.get(User.class, "3");//将id为3的user对象从数据库中查询出来,并放在session缓存中
System.out.println(user);//这里输出不为null
System.out.println(session.contains(user));//输出true,表示缓存中包含此user
session.delete(user);//这句代码是表示把user从缓存中删除吗?
System.out.println(session.contains(user));//输出false,表示缓存中不包含此user
user=(User)session.get(User.class, "3");//加载上来的user为null,但是为什么没有发出sql语句?
System.out.println(user);//输出为null
session.getTransaction().commit();

我今天又试了一下,以上代码运行结果仍然不能理解,求高手
computerlibin 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 java_devil 的回复:]

不知道你的事务是怎么处理的。。。按理说没有手动配置过2级缓存,2个例子都应该发出SQL语句的
你确定2个配置都一样吗?
那个flush的操作好像是属于缓存的管理,强制将数据持久化。
[/Quote]
这两个例子都分别在一个事务中,我没有配置二级缓存,两个例子的所有设置完全一样(实际上第二个例子是第一个例子加了一行代码),我感觉session.delete(user)并没有将user从缓存中删除,直到执行session.flush()时才将user从缓存中删除,但是第一个例子最后得到的user为null,这个就不能理解了。。。
绝世酱油瓶 2011-09-23
  • 打赏
  • 举报
回复
不知道你的事务是怎么处理的。。。按理说没有手动配置过2级缓存,2个例子都应该发出SQL语句的
你确定2个配置都一样吗?
那个flush的操作好像是属于缓存的管理,强制将数据持久化。
computerlibin 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lijing0511 的回复:]

你把show_sql 设为true, 以及 cache的log设为debug。 后台日志都看的到了。
[/Quote]
能不能把代码贴出来,我不会弄啊
安心逍遥 2011-09-23
  • 打赏
  • 举报
回复
cache的log设为debug
lijing0511 2011-09-23
  • 打赏
  • 举报
回复
你把show_sql 设为true, 以及 cache的log设为debug。 后台日志都看的到了。
bijanen19861113 2011-09-23
  • 打赏
  • 举报
回复
我个人的理解是:第一个例子中只是user对象在缓存中的不同状态,因为此时事务尚未提交。而第二个例子中flush的时候,事务已经进行了提交,此时已经把user从缓存中清除了,当你再次get的时候,缓存中已经不存在user对象了,所以它会再次发出sql去数据库中查找..
jun921373786 2011-09-23
  • 打赏
  • 举报
回复
学习。。。。。。。。。。。。。。。。。
xiaozhuangfeng 2011-09-23
  • 打赏
  • 举报
回复
cache的log设为debug,这个好像听说过,不过没实际用过
  • 打赏
  • 举报
回复
围观下
555555555555555 2011-09-23
  • 打赏
  • 举报
回复
delete(Object object) Remove a persistent instance from the datastore.

----

get(Class clazz, Serializable id)
Return the persistent instance of the given entity class with the given identifier, or null if there is no such persistent instance.
555555555555555 2011-09-23
  • 打赏
  • 举报
回复
delete(Object object)           Remove a persistent instance from the datastore.

----

get(Class clazz, Serializable id)
Return the persistent instance of the given entity class with the given identifier, or null if there is no such persistent instance.


上面API说了,session.get()方法将执行查询,或者当user实例不存在的时,返回null。
computerlibin 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wangquanzheng 的回复:]

cache的log设为debug
[/Quote]
能给个详细点的介绍吗?有点看不懂你说的
computerlibin 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bijanen19861113 的回复:]

我个人的理解是:第一个例子中只是user对象在缓存中的不同状态,因为此时事务尚未提交。而第二个例子中flush的时候,事务已经进行了提交,此时已经把user从缓存中清除了,当你再次get的时候,缓存中已经不存在user对象了,所以它会再次发出sql去数据库中查找..
[/Quote]
这两个例子都是在事务中,执行完最后一行代码才提交的事务,session.flush()是不提交事务的

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧