Hibernate要点(二)

来源:互联网 发布:淘宝小样 编辑:程序博客网 时间:2024/06/11 02:33
24.ThreadLocal:它会为每个线程维护一个私有的变量空间。实际上, 
其实现原理是在JVM 中维护一个Map,这个Map的key 就是当前的线程对象,而value则是 
线程通过ThreadLocal.set方法保存的对象实例。当线程调用ThreadLocal.get方法时, 
ThreadLocal会根据当前线程对象的引用,取出Map中对应的对象返回。 
 这样,ThreadLocal通过以各个线程对象的引用作为区分,从而将不同线程的变量隔离开 
来。 

25.Hibernate官方开发手册标准示例: 
  public class HibernateUtil { 
private static SessionFactory sessionFactory; 
static { 
try { 
// Create the SessionFactory 
sessionFactory = new 
Configuration().configure().buildSessionFactory(); 
} catch (HibernateException ex) { 
throw new RuntimeException( 
"Configuration problem: " + ex.getMessage(), 
ex 
); 


public static final ThreadLocal session = new ThreadLocal(); 
public static Session currentSession() throws HibernateException 

Session s = (Session) session.get(); 
// Open a new Session, if this Thread has none yet 
if (s == null) { 
s = sessionFactory.openSession(); 
session.set(s); 

return s; 

public static void closeSession() throws HibernateException { 
Session s = (Session) session.get(); 
session.set(null); 
if (s != null) 
s.close(); 

}  

     
26.通过filter实现session的重用: 
   public class PersistenceFilter implements Filter 

protected static ThreadLocal hibernateHolder = new ThreadLocal(); 
public void doFilter(ServletRequest request, ServletResponse 
response, FilterChain chain) 
throws IOException, ServletException 

hibernateHolder.set(getSession()); 
try 

…… 
chain.doFilter(request, response); 
…… 

finally 

Session sess = (Session)hibernateHolder.get(); 
if (sess != null) 

hibernateHolder.set(null); 
try 

sess.close(); 

catch (HibernateException ex) { 
throw new ServletException(ex); 




……} 
27.Spring的参数化事务管理功能相当强大,笔者建议在基于Spring Framework的应用 
开发中,尽量使用容器管理事务,以获得数据逻辑代码的最佳可读性。 
  
public class UserDAO extends HibernateDaoSupport implements IUserDAO 

public void insertUser(User user) { 
getHibernateTemplate().saveOrUpdate(user); 



  上面的UserDAO实现了自定义的IUserDAO接口,并扩展了抽象类: 
HibernateDaoSupport 
HibernateSupport实现了HibernateTemplate和SessionFactory实例的关联。 
HibernateTemplate对Hibernate Session操作进行了封装,而 
HibernateTemplate.execute方法则是一封装机制的核心 
  *在spring的配置文件里,移植了整个hibernate.cfg.xml的内容。