锁定老帖子 主题:Hibernate文档上的这段话如何解释?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2003-12-02
经过验证,上面的代码有问题!
sf 会多次 创建。 建议如此创建单例变量: private static SessionFactory sf; static { sf = sf = new Configuration().configure().buildSessionFactory(); } public static Session currentSession() throws HibernateException { Session s = (Session) sessionThread.get(); if (s == null) { // SessionFactory sf = new Configuration().configure().buildSessionFactory(); s = sf.openSession(); sessionThread.set(s); } return s; } 可避免反复build. |
|
返回顶楼 | |
发表时间:2003-12-02
我上面已经提到了,其实重复创建几个sf也没有什么关系,况且只在刚访问sf的时候会出现这种情况,而使用静态初试化块可能会有隐含的问题,例如一旦sf被释放掉,或者由于其他原因,例如数据库重起,连接池重新配置等等原因造成的sf被重置为null,那么你的程序就会报错。因此你这种方法是肯定不行的。
第一,多创建几个sf没有坏处 第二,不要给该方法加上synchronized方法,会影响性能。 第三,不要把sf的创建放到静态初试化快,一旦sf重置,就会报错。 |
|
返回顶楼 | |
发表时间:2003-12-02
请自行调试一下...
|
|
返回顶楼 | |
发表时间:2003-12-02
我确实写错了,谢谢你的批评和指正!
改写如下: /* * Created on 2003-11-16 * */ package com.cares.util; import net.sf.hibernate.HibernateException; import net.sf.hibernate.Session; import net.sf.hibernate.SessionFactory; import net.sf.hibernate.Transaction; import net.sf.hibernate.cfg.Configuration; import net.sf.hibernate.tool.hbm2ddl.SchemaExport; /** * * 获取Session连接工厂类 * * @author Robbin Fan * */ public class ReportSession { private static final ThreadLocal sessionThread = new ThreadLocal();; private static final ThreadLocal transactionThread = new ThreadLocal();; private static SessionFactory sf = null; /** * 获取当前线程使用的Session * * @return Session * @throws HibernateException */ public static Session currentSession(); throws HibernateException { Session s = (Session); sessionThread.get();; if (s == null); { if (sf == null); sf = new Configuration();.configure();.buildSessionFactory();; s = sf.openSession();; sessionThread.set(s);; } return s; } /** * 启动或者加入当前Session的Transaction * * @return Transaction * @throws HibernateException */ public static Transaction currentTransaction(); throws HibernateException { Transaction tx = (Transaction); transactionThread.get();; if (tx == null); { tx = currentSession();.beginTransaction();; transactionThread.set(tx);; } return tx; } /** * 提交当前Session的Transaction * * @throws HibernateException */ public static void commitTransaction(); throws HibernateException { Transaction tx = (Transaction); transactionThread.get();; transactionThread.set(null);; if (tx != null); tx.commit();; } /** * 关闭当前线程使用的Session * * @throws HibernateException */ public static void closeSession(); throws HibernateException { Session s = (Session); sessionThread.get();; sessionThread.set(null);; if (s != null); s.close();; } /** * 根据映射文件和持久对象生成数据库DDL,生成文件为create_table.sql * * @param args 参数 */ public static void main(String[] args); { try { String conf = "hibernate.cfg.xml"; if (args.length != 0); conf = args[0]; Configuration cfg = new Configuration();.configure("/" + conf);; SchemaExport se = new SchemaExport(cfg);; //se.setOutputFile("create_table.sql");; se.create(true,true);; } catch (HibernateException e); { e.printStackTrace();; } } } |
|
返回顶楼 | |