被Hibernate的Session绊了一跤

写这篇博客的原因是出于昨天我在问答频道的一个问题,该问题如下:

 

    当在servlet中调用DAO的save方法并提交事务后,控制台显示已经执行了sql语句,但是却没有向数据库中记录,如果把数据库的隔离级别设置为未提交读,这是可以看见刚插入的记录,但是之前已经调用了提交事务的语句,这是为什么呢? 
注:主键生成策略为“native”,数据库是MySQL。
问题补充:
已经把数据库操作放到了事务中,而当第二条记录提交的时候才会向数据库中插入第一条记录,而新提交的记录不会被插入。
问题补充:

Java代码 ;
  1. UserDAO userDAO = new UserDAO();  
  2.         User user = new User();  
  3.           
  4.         SessionFactory sessionFactory = HibernateSessionFactory.getSessionFactory();  
  5.         Session session = sessionFactory.openSession();  
  6.         Transaction tx = null;  
  7.           
  8.         user.setUsername(registerForm.getUsername());  
  9.           
  10.         user.setEmail(registerForm.getEmail());  
  11.   
  12.         try {  
  13.             tx = session.beginTransaction();  
  14.             userDAO.save(user);  
  15.             tx.commit();  
  16.         }  
  17.         catch (RuntimeException e) {  
  18.             if (tx != null)  
  19.                 tx.rollback();  
  20.             throw e;   
  21.         }  
  22.         finally {  
  23.             session.close();  
  24.         }  

通过查看Hibernate的代码发现的其中的问题。
我在获得Session对象的时候采用的是 sessionFactory.openSession();  Hibernate会新产生一个Session对象,接着执行userDAO.save(user)语句,而UserDAO类的save方法中用到的Session是通过HibernateSessionFactory.getSession()方法获得的,再继续看HibernateSessionFactory,其getSession()方法如下
 public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

		if (session == null || !session.isOpen()) {
			if (sessionFactory == null) {
				rebuildSessionFactory();
			}
			session = (sessionFactory != null) ? sessionFactory.openSession()
					: null;
			threadLocal.set(session);
		}

        return session;
    }
 因此HibernateSessionFactory会为每个线程创建一个Session对象,MyEclipse所生成的DAO类就是用的这个
Session,这与在程序中通过openSession()方法所得到的是两个不同的Session对象,因此我在程序中调用的提交事务方法是在后一个Session中进行的,而对User对象的保存是在第一个Session中,而该Session中并没有执行提交事务操作。
    但是,至于之前的为什么当我执行第二次插入操作时会把前一条记录插入的原因还没有弄清楚,哪位大哥知道,欢迎留言。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值