Hibernate
- openSession
测试代码:
1)sf.openSession()时,sessionFactory会new一个新的Session,从配置中读取是否要自动关闭Session,而配置中默认isAutoCloseSessionEnabled为false。
2)session.getTransaction().commit(),提交事务
3)提交完成或回滚完成以后,会执行一个方法closeIfRequired();在该方法里面去关闭session,关闭session之前又一个判断transactionContext.shouldAutoClose();
- 在transactionContext.shouldAutoClose()中,判断autoCloseSessionEnabled,而这个值,在sf.openSession()时,已经被设成了false,故在提交完成以后,无法关闭,需要手动关闭。
2.getCurrentSession
测试代码:
- sf.getCurrentSession();
这里session和线程绑定的细节如下:
在方法currentSession中,首先去当前线程中取session,若没有,则继续bindOrObtainSession();
- 在bindOrObtainSession()中,调用了SessionImpl的另一个openSession方法
在该方法中,isAutoCloseEnabled被设置成了true;
- 在提交transaction时,提交完成后,就会执行transactionContext.managedClose()方法,在该方法中关闭资源,包括session
- 注意到一个问题:
进去代理类TransactionProjectionWrapper