二、hibernate提交事务

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

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中的数据保存到数据库中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章