二、hibernate提交事务

来源:互联网 发布:淘宝网开店怎么收费 编辑:程序博客网 时间:2024/06/04 17:41

一、将读取配置文件和开启事务抽象为一个工具类方便以后操作。

public class HibernateUtil {    private static Configuration cfg=null;    private static SessionFactory factory=null;    private static Session session = null;    static{        cfg = new Configuration().configure();        factory = cfg.buildSessionFactory(new StandardServiceRegistryBuilder().configure().build());    }    public static Session getSession(){        if(factory!=null)            return session=factory.openSession();        factory = cfg.buildSessionFactory(new StandardServiceRegistryBuilder().configure().build());        return session=factory.openSession();    }    public static void closeSession(){        if(session!=null&&session.isOpen())            session.close();    }}

二、用junit测试

@Test    public void testSave(){        Session session = null;        Transaction tx = null;        User user = null;        try {            session = HibernateUtil.getSession();            tx = session.beginTransaction();            user = new User();            user.setName("吴京");            user.setPwd("111");            session.save(user);            //在持久状态下;脏数据检查:当提交事务,清理缓存时发现session中数据            //和数据库中数据不一致时,将会把session中的数据更新到数据库中            user.setName("萝莉");            //在保存以后再修改对象,那么会产生多天sql语句,效率较低,一般在save前修改            session.flush();            tx.commit();//若只刷新不提交数据将不能把脏数据检查发现的数据存到数据库中        } catch (Exception e) {            e.printStackTrace();            System.out.println("抛出异常!");            tx.rollback();        }finally {            HibernateUtil.closeSession();        }        //游离状态        System.out.println("姓名:"+user.getName());    }

执行结果:
这里写图片描述
执行后发现有两条sql语句。
这里写图片描述
数据库中保存的是“萝莉”而不是“吴京”,说明在提交事务的时候回进行脏数据检查时,将session中的数据保存到数据库中。

原创粉丝点击