Package com.liusoft.util.db

Source Code of com.liusoft.util.db.Hibernate

/*
*  Hibernate.java
*  This program is free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU Library General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program; if not, write to the Free Software
*  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*  Author: Winter Lau
*  http://dlog4j.sourceforge.net
*/
package com.liusoft.util.db;

import java.io.File;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

/**
* Hibernate�IJ����ӿ�
* @author liudong
*/
public class Hibernate {

  private final static Log log = LogFactory.getLog(Hibernate.class);

  private String hibernate_cfg;
  private SessionFactory sessionFactory;
  private ThreadLocal sessions;
  private ThreadLocal transactions;

  /**
   * Initialize the hibernate environment
   * @param hibernate_cfg
   * @throws MalformedURLException
   */
  public final static Hibernate init(String hibernate_cfg){
    return new Hibernate(hibernate_cfg);
  }

  /**
   * ��������������ļ���ʼ��Hibernate
   * @param cfg_path
   */
  private Hibernate(String cfg_path){
    sessions = new ThreadLocal();
    transactions = new ThreadLocal();
    Configuration cfg = new Configuration().configure(new File(cfg_path));     
    sessionFactory = cfg.buildSessionFactory();
    this.hibernate_cfg = cfg_path;
  }

  /**
   * ���ض�Ӧ��Hibernate�����ļ���·��
   * @return
   */
  public String getHibernateConfig() {
    return hibernate_cfg;
  }
   
  /**
   * Get a instance of hibernate's session
   * @return
   * @throws HibernateException
   */
  public Session getSession(){
    if(sessions == null)
      return null;

    Session ssn = (Session)sessions.get();
    if (ssn == null) {
      ssn = sessionFactory.openSession();
      sessions.set(ssn);
    }
   
    return ssn;
  }
   
  /**
   * Closes the Session local to the thread.
   */
  public void closeSession(){
    if(sessions == null)
      return;
    // Would be written as a no-op in an EJB container with CMT
    Session ssn = (Session)sessions.get();
    if(ssn == null)
      return;
    else if(ssn.isOpen())
      ssn.close();   
   
    sessions.set(null);
  }

  /**
   * Start a new database transaction.
   */
  public void beginTransaction(){
    if(transactions == null)
      return;
    // Would be written as a no-op in an EJB container with CMT
    Transaction tx = (Transaction)transactions.get();
    if (tx == null || tx.wasCommitted() || tx.wasRolledBack()) {
      Session ssn = (Session)sessions.get();
      if(ssn == null){
        ssn = getSession();
        tx = ssn.beginTransaction();
        transactions.set(tx);
      }
      else if(ssn != null){
        tx = ssn.beginTransaction();
        transactions.set(tx);       
      }
    }
    else{
      if(tx!=null && log.isWarnEnabled())
        log.warn("Trying to begin a exist transaction, nothing to do.", new Exception());
    }
  }

  /**
   * Commit the database transaction.
   */
  public void commit(){
    if(transactions == null)
      return;
    // Would be written as a no-op in an EJB container with CMT
    Transaction tx = (Transaction)transactions.get();
    if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
      tx.commit();
    }
    else{
      if(tx!=null && log.isWarnEnabled())
        log.warn("Trying to commit the uncommitable transaction, nothing to do.");
    }
    if(tx!=null)
      transactions.set(null);
  }

  /**
   * Rollback the database transaction.
   */
  public void rollback(){
    if(transactions == null)
      return;
    Transaction tx = (Transaction)transactions.get();
    transactions.set(null);
    if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
      tx.rollback();
    }
    else{
      if(tx!=null && log.isWarnEnabled())
        log.warn("Trying to rollback the unrollbackable transaction, nothing to do.");
    }
  }

  /**
   * �ͷ�����Hibernateռ�õ���Դ
   * @see com.liusoft.dlog4j.servlet.DLOG_ActionServlet#destroy()
   */
  public void destroy(){
    if(sessionFactory!=null){
      sessionFactory.close();
      sessionFactory = null;
    }
    sessions = null;
    transactions = null;
    if(log.isWarnEnabled())
      log.warn("Hibernate("+hibernate_cfg+") was destroy successfully, all of sessions were closed.");
  }

}
TOP

Related Classes of com.liusoft.util.db.Hibernate

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.