浏览 4323 次
锁定老帖子 主题:讨论:这样封装Session行不行?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-03-01
这是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();; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-03-01
HibernateUtil里的构造器里的代码应该放在一个静态初始化块中,这样可以使只存在一个sessionfactory实例。
|
|
返回顶楼 | |
发表时间:2004-03-02
现在情况是这样的,有几十个分公司的数据集中,数据放同一台服务器上压力太大,考虑按公司分开存放,比如每5个分公司的放一台数据库服务器,但应用服务器肯定不会这样分,所以我想根据分公司代码来动态的取cfg文件去创建SessionFactory,但是这样每个连接都会创建一个SF,我想应该建个map,把每个生成的Sf和cfg文件对应存放进去,然后再生成先根据cfg文件判断有无已经生成的SF,如果已经有就不再生成了。
|
|
返回顶楼 | |
发表时间:2004-03-02
静态初始化块用来实现单例模式,这样只会有一个sessionfactory对象。只会在这个类第一次被载入时运行静态初始化块中的内容。
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2004-03-02
多个数据源就在静态初始化块中初始化多个SF,然后你的getSession方法可以用一个参数表示你到底要那个SF的session就行了。不过你的代码也行,只不过不是地道的单例模式的实现方式。
|
|
返回顶楼 | |
发表时间:2004-03-02
谢谢sayor的意见,有道理!
|
|
返回顶楼 | |