java - Hibernate中清除持久化状态对象失效

查看:69
本文介绍了java - Hibernate中清除持久化状态对象失效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

调用session.clear()或者session.evict(obj)皆无法清除Hibernate中的持久化状态的对象

目前已知的情况是:

  1. 当主键使用identify策略时,session.save(person)调用完成后会发出INSERT语句

  2. 当主键使用increment策略时,不会发出INSERT语句,并且结果与预期一致

代码如下:

@Test
public void test1(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    
    Person person = new Person();
    person.setName("tom888");
    session.save(person);    //此处是否发出**INSERT**语句与主键策略有关
    
    session.evict(person);
//  session.clear();
    transaction.commit();
    session.close();
}

主键使用identify策略时,代码执行结果:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into Person (name, description) values (?, ?)

我期待的结果应该是数据不应该有任何变化才对,也不应该执行任何SQL语句,因为我调用了session.clear()或者session.evict(obj)时,person应该由持久化状态转为游离状态,期待您的回答!

解决方案

通过一番学习找到了问题所在,那就自问自答吧,希望能帮到其他正在学习的朋友。
原因:这个问题是由持久化类中的XXX.hbm.xml定义的id生成器策略引发的,本人在此处使用了identity策略,使用此策略会使得session.save()方法在得到执行时立即发出INSERT语句,此时对象无论处于任何状态都不会影响此对象对数据库的更新。
解决方法:id生成器策略使用非依赖数据库产生主键的策略即可。

详情请查看我的剖析:Hibernate中由主键策略引起的session.evict()和session.clear()失效假象问题分析

这篇关于java - Hibernate中清除持久化状态对象失效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆