HibernateSessionFactory

来源:互联网 发布:linux排序命令 编辑:程序博客网 时间:2024/05/21 23:50
package com.hibernate;import java.sql.SQLException;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;/** * Configures and provides access to Hibernate sessions, tied to the * current thread of execution.  Follows the Thread Local Session * pattern, see {@link http://hibernate.org/42.html}. */public class HibernateSessionFactory {    /**      * Location of hibernate.cfg.xml file.     * NOTICE: Location should be on the classpath as Hibernate uses     * #resourceAsStream style lookup for its configuration file. That     * is place the config file in a Java package - the default location     * is the default Java package.<br><br>     * Defaults: <br>     * <code>CONFIG_FILE_LOCATION = "/hibernate.conf.xml"</code>      * You can change location with setConfigFile method     * session will be rebuilded after change of config file     */    private static String CONFIG_FILE_LOCATION = "/com/hibernate/hibernate.cfg.xml";private static final ThreadLocal threadLocal = new ThreadLocal();    private  static Configuration configuration = new Configuration();    private static SessionFactory sessionFactory;    private static String configFile = CONFIG_FILE_LOCATION;    private HibernateSessionFactory() {    }/**     * Returns the ThreadLocal Session instance.  Lazy initialize     * the <code>SessionFactory</code> if needed.     *     *  @return Session     *  @throws HibernateException     */    public static Session getCurrentSession() throws HibernateException {        Session session = (Session) threadLocal.get();try {if (session == null || !session.isOpen()|| session.connection().isClosed()) {if (sessionFactory == null) {rebuildSessionFactory();}session = (sessionFactory != null) ? sessionFactory.openSession(): null;threadLocal.set(session);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}        return session;    }/**     *  Rebuild hibernate session factory     *     */public static void rebuildSessionFactory() {try {configuration.configure(configFile);sessionFactory = configuration.buildSessionFactory();} catch (Exception e) {System.err.println("%%%% Error Creating SessionFactory %%%%");e.printStackTrace();}}/**     *  Close the single hibernate session instance.     *     *  @throws HibernateException     */    public static void closeCurrentSession() throws HibernateException {        Session session = (Session) threadLocal.get();        threadLocal.set(null);        if (session != null) {            session.close();        }    }/**     *  return session factory     *     */public static SessionFactory getSessionFactory() {return sessionFactory;}/**     *  return session factory     *     *session factory will be rebuilded in the next call     */public static void setConfigFile(String configFile) {HibernateSessionFactory.configFile = configFile;sessionFactory = null;}/**     *  return hibernate configuration     *     */public static Configuration getConfiguration() {return configuration;}}

在某个类中使用,则应要:

// 开启sessionpublic void openSession() {this.session = HibernateSessionFactory.getCurrentSession();}// 关闭sessionpublic void closeSession() throws HibernateException {this.session.close();}

或者

// 开启事务public void beginTransaction() throws HibernateException {try {this.session = HibernateSessionFactory.getCurrentSession();this.transaction = this.session.beginTransaction();} catch (Exception ex) {throw new HibernateException("开启事务时发生如下错误:" + ex.getMessage());}}// 提交事务public void commitTransaction() throws HibernateException {try {this.transaction.commit();} catch (Exception ex) {ex.printStackTrace();this.transaction.rollback();System.out.println("提交事务时发生如下错误:" + ex.getMessage());throw new HibernateException("提交事务时发生如下错误:" + ex.getMessage());} finally {this.session.close();}}


0 0