论坛首页 Java企业应用论坛

Hibernate文档上的这段话如何解释?

浏览 8789 次
精华帖 (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.
0 请登录后投票
   发表时间:2003-12-02  
我上面已经提到了,其实重复创建几个sf也没有什么关系,况且只在刚访问sf的时候会出现这种情况,而使用静态初试化块可能会有隐含的问题,例如一旦sf被释放掉,或者由于其他原因,例如数据库重起,连接池重新配置等等原因造成的sf被重置为null,那么你的程序就会报错。因此你这种方法是肯定不行的。

第一,多创建几个sf没有坏处
第二,不要给该方法加上synchronized方法,会影响性能。
第三,不要把sf的创建放到静态初试化快,一旦sf重置,就会报错。
0 请登录后投票
   发表时间:2003-12-02  
请自行调试一下...
0 请登录后投票
   发表时间: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();;
		}
		
	}
}


0 请登录后投票
论坛首页 Java企业应用版

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