- package com.censoft.portlets.db.base;
- import com.censoft.portlets.db.DbTools;
- import net.sf.hibernate.*;
- import net.sf.hibernate.cfg.*;
- public class HibernateSession {
- public static final ThreadLocal sessionContext = new ThreadLocal();;
- private Session session;
- private int level;
- public static Session currentSession(String cfgFilePath); throws Exception {
- HibernateSession hSession = (HibernateSession);sessionContext.get();;
- if (hSession == null);
- {
- hSession = new HibernateSession();;
- SessionFactory factory = DbTools.getSessionFactory(cfgFilePath);;
- hSession.session = factory.openSession();;
- hSession.level = 0;
- sessionContext.set( hSession );;
- }
- hSession.level++;
- return hSession.session;
- }
- public static void closeSession(); throws Exception {
- HibernateSession hSession = (HibernateSession);sessionContext.get();;
- if (hSession == null);
- {
- return;
- }
- hSession.level--;
- if (hSession.level <= 0);
- {
- if (hSession.session != null && hSession.session.isOpen(););
- {
- hSession.session.close();;
- }
- sessionContext.set( null );;
- }
- }
- }
- 码并不是nested transaction只是在同一个线程里只使用一个session对象。事务嵌套是一种概念,SUN的J2EE规范的确没有实现事务嵌套。但其实我们使用flat transaction其实也已经足够了。
- 这种做法有点象COM里引用计数。
我在想,事实业务中是否需要嵌套事务。如果可能的话,尽量把做法向简单那里靠。