论坛首页 Java企业应用论坛

讨论:这样封装Session行不行?

浏览 4323 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-03-01  
刚开始用Hibernate,这是我写的一个关于常用操作的封装,用了一个抽象类来实现CUD的操作和JDBC事务的开始和结束,然后所有的数据访问类都继承这个抽象类,大家看可行否,有什么问题?给指导指导!
这是DAO抽象接口:
import net.sf.hibernate.*;
import java.sql.SQLException;

public abstract class DAO {
	protected HibernateUtil hu = new HibernateUtil();;
	protected Session session;
	private net.sf.hibernate.Transaction tx;

	/**
	 * 取得Session
	 * @throws HibernateException
	 * @throws SQLException
	 */
	public void getSession(); throws HibernateException, SQLException {
		session = hu.currentSession();;
	}
	/**
	 * 
	 * 取得Session并打开JDBC事务,当Hibernate使用JTA管理事务时,此方法不可用
	 * @throws HibernateException
	 * @throws SQLException
	 */
	public void getSessionWithTrans(); throws HibernateException, SQLException {
		session = hu.currentSession();;
		tx = session.beginTransaction();;
	}
	/**
	 * 
	 * 保存对象
	 * @param obj
	 * @throws HibernateException
	 * @throws SQLException
	 */
	public void save(Object obj); throws HibernateException, SQLException {
		try {
			session.save(obj);;
			session.flush();;
		}catch(Exception e);{
			rollbackTx();;
		}
	}
	/**
	 * 
	 * 删除对象
	 * @param obj
	 * @throws HibernateException
	 * @throws SQLException
	 */
	public void delete(Object obj); throws HibernateException, SQLException {
		try{
		session.delete(obj);;
		session.flush();;
		}catch(Exception e);{
			rollbackTx();;			
		}
	}
	/**
	 * 
	 * 更新对象
	 * @param obj
	 * @throws HibernateException
	 * @throws SQLException
	 */
	public void update(Object obj); throws HibernateException, SQLException {
		try{
		session.update(obj);;
		session.flush();;
		}catch(Exception e );{
			rollbackTx();;
		}
	}
	/**
	 * 
	 * 关闭无事务的Session
	 * @throws HibernateException
	 * @throws SQLException
	 */
	public void closeSession(); throws HibernateException, SQLException {
		session.flush();;
		session.connection();.commit();;
		hu.closeSession();;
	}
	/**
	 * 
	 * 关闭带JDBC事务的Session,当Hibernate使用JTA管理事务时,此方法不可用
	 * @throws HibernateException
	 * @throws SQLException
	 */
	public void closeSessionWithTrans();
		throws HibernateException, SQLException {
		tx.commit();;
		tx = null;
		hu.closeSession();;
	}
	/**
	 * 出现异常时回滚JDBC事务
	 * @throws HibernateException
	 * @throws SQLException
	 */
	private void rollbackTx(); throws HibernateException, SQLException{
		if (null != tx);{
			tx.rollback();;
			tx = null;
		}		
	}
}


这是继承抽象类的数据操作类
import net.sf.hibernate.*;
import java.sql.SQLException;
public class CatDAO extends DAO {
	public void saveCat(Cat cat);   throws HibernateException,SQLException{
		save(cat);;
	}
	public void updateCat(Cat cat); throws HibernateException,SQLException{
		update(cat);;
	}
	public void deleteCat(Cat cat); throws HibernateException,SQLException{
		delete(cat);;
	}
}

这是取得SessionFactory的类,因为可能需要多个工厂,所以没有设为Static 的。
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
public class HibernateUtil  {
	private   SessionFactory sessionFactory;

	public  static ThreadLocal session = new ThreadLocal();;
	/**
	 *
	 * 使用默认的配置文件生成SessionFactory
	 */
	public  HibernateUtil();{
		try {
			sessionFactory = new Configuration();.configure();.buildSessionFactory();;	
		} catch (Exception ex); {
			throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage();, ex);;
		}
	}
	/**
	 * 
	 * 使用默认的配置文件生成SessionFactory
	 */
	public  HibernateUtil(String configFile);{
		try {
			sessionFactory = new Configuration();.configure(configFile);.buildSessionFactory();;
		} catch (Exception ex); {
			throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage();, ex);;
		}
	}
	/**
	 * 
	 * 取得Session
	 * @return
	 * @throws HibernateException
	 */
	public  Session currentSession(); throws HibernateException {
		Session s = (Session); session.get();;
		if (null == s); {
			s = sessionFactory.openSession();;
			session.set(s);;
		}
		return s;
	}
	/**
	 * 
	 * 关闭Session
	 * @throws HibernateException
	 */
	public  void closeSession(); throws HibernateException {
		Session s = (Session); session.get();;
		session.set(null);;
		if (s != null);
			s.close();;
	}
	
}
   发表时间:2004-03-01  
HibernateUtil里的构造器里的代码应该放在一个静态初始化块中,这样可以使只存在一个sessionfactory实例。
0 请登录后投票
   发表时间:2004-03-02  
现在情况是这样的,有几十个分公司的数据集中,数据放同一台服务器上压力太大,考虑按公司分开存放,比如每5个分公司的放一台数据库服务器,但应用服务器肯定不会这样分,所以我想根据分公司代码来动态的取cfg文件去创建SessionFactory,但是这样每个连接都会创建一个SF,我想应该建个map,把每个生成的Sf和cfg文件对应存放进去,然后再生成先根据cfg文件判断有无已经生成的SF,如果已经有就不再生成了。
0 请登录后投票
   发表时间:2004-03-02  
静态初始化块用来实现单例模式,这样只会有一个sessionfactory对象。只会在这个类第一次被载入时运行静态初始化块中的内容。
0 请登录后投票
   发表时间:2004-03-02  
谢谢sayor
可是因为我要连接多个DataServer啊,一个SF不行吧
我把那个构造函数这样改了一下,各位给看看
private static HashMap mapSessionFactory = new HashMap();;
	public HibernateUtil(String configFile); {
		if (mapSessionFactory.containsKey(configFile);); {
			sessionFactory = (SessionFactory);mapSessionFactory.get(configFile);;
		} else {
			try {
				sessionFactory = 
					new Configuration();
					.configure(configFile);
					.buildSessionFactory();;
			} catch (Exception ex); {
				throw new RuntimeException(
						"Exception building SessionFactory: " + ex.getMessage();,
						ex);;
			}
			mapSessionFactory.put(configFile,sessionFactory);;
		}

	}

这样可以保证每个数据库连接只有一个SessionFactory
0 请登录后投票
   发表时间:2004-03-02  
多个数据源就在静态初始化块中初始化多个SF,然后你的getSession方法可以用一个参数表示你到底要那个SF的session就行了。不过你的代码也行,只不过不是地道的单例模式的实现方式。
0 请登录后投票
   发表时间:2004-03-02  
谢谢sayor的意见,有道理!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics