`

Hibernate、Hibernate4获取SessionFactory对象方法的变化

 
阅读更多

Hibernate用来获取配置文件的类是Configuration,若用Annotation的话就是AnnotationConfiguration类。

例:Configuration config = new Configuration();

config.configure("hibernate.cfg.xml");//用configure()方法取得。

//或者config.configure();不用加参数,因为只有需要一个//hibernate.cfg.xml在src路径下。Hibernate会自动匹配

取得配置文件后:需要一个Session对象来操作数据库的存取。Session对象是有SessionFactory的对象来产生的。

在4.0版本之前sessionFactory由取得配置文件的对象config.BuildSessionFactory();产生。

SessionFactory sessionFactory =config.buildSessionFactory();

再由sessionFactory.getCurrentSession();方法产生session。

Session session = sessionFactory.getCurrentSession();

有了session对象之后就可以对数据库进行操作了。但hibernate的所有操作都是建立在事务之上的。所以session操作之前要先打开一个事务:

session.beginTransaction();

同理操作完之后要提交事务:

session.getTransaction().commit();

若出错。可回滚:

session.getTransaction().roolback();(这两句可放在tyr{……}catch{……}语句里面)

另外还要关闭session对象:

session.close();

升级到4.0之后取得session的方法有所改变,hibernate增加了一个注册机ServiceRegistryBuilder 类。要先生成一个注册机对象,然后所有的生成SessionFactory的对象要象注册机注册一下再用。生成方法还是config.buildSessionFactory()方法,不过加了个注册机的参数。config.buildSessionFactory(ServiceRegistry  registry);

具体方法如下:

ServiceRegistry resgistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();

SessionFactory  factory = config.buildSessionFactory(resgistry);

Session session = factory.openSession();

 

 

hibernate4下拿到SessionFactory的一段经典代码

当我们去拿hibernate4的sessionFactory时,我们发现原来使的一直很顺手的new Configuration().configure().buildSessionFactory()中的buildSessionFactory方法已经过期了,取而代之的是buildSessionFactory(ServiceRegistry serviceRegistry)方法。查看ServiceRegistry的构造方法,顿时感觉天旋地转,这相当地令人抓狂,不过hibernate可能有其自己的考虑。

经过自己去google,发现了一段经典的取ServiceRegistry的代码,不敢独享,特贴出来与大家共享

 

privatestaticSessionFactory sessionFactory;
privatestaticServiceRegistry serviceRegistry;
 
privatestaticSessionFactory configureSessionFactory()throwsHibernateException{
    Configuration configuration =newConfiguration();
    configuration.configure();
    serviceRegistry =newServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    return sessionFactory;
}

 

两个Hibernate工具类:

package com.test.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class Hbutil
{
  private static SessionFactory  sessionFactory;
  private static ServiceRegistry serviceRegistry;

  // the javadoc recommends use of another method

  // buildSessionFactory(ServiceRegistry serviceRegistry)

  private static SessionFactory configureSessionFactory() throws HibernateException
  {
    Configuration configuration = new Configuration();

    configuration.configure();
    serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    return sessionFactory;
  }

  public static SessionFactory getSessionFactory()
  {
    return configureSessionFactory();
  }
}

 

package com.test.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

/**
 * Description:
 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> 
 * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author  Yeeku.H.Lee kongyeeku@163.com
 * @version  1.0
 */ 
public class HibernateUtil
{
  public static final SessionFactory sessionFactory;
  
  static
  {
    try
    {
      //采用默认的hibernate.cfg.xml来启动一个Configuration的实例
      //由Configuration的实例来创建一个SessionFactory实例
      sessionFactory = Hbutil.getSessionFactory();
    }
    catch (Throwable ex)
    {
      System.err.println("Initial SessionFactory creation failed." + ex);
      throw new ExceptionInInitializerError(ex);
    }
  }
  
  //ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步  
  public static final ThreadLocal<Session> session= new ThreadLocal<Session>();
  
  public static Session currentSession() throws HibernateException
  {
    Session s = session.get();
    //如果该线程还没有Session,则创建一个新的Session
    if (s == null)
    {
      s = sessionFactory.openSession();
      //将获得的Session变量存储在ThreadLocal变量session里
      session.set(s);
    }
    return s;
  }
  
  public static void closeSession() throws HibernateException 
  {
    Session s = session.get();
    if (s != null)
      s.close();
    session.set(null);
  }
}

 

A 在3.6.8版本中,可以直接用
SessionFactory sf = new Configuration()
    .configure()    //    直接用hibernate.cfg.xml来进行配置和创建
    .buildSessionFactory();

B 在4.0.0版本中,因Configuration().configure()方法被废除了,
故用以下方式来创建
Configuration config = new Configuration()
            .addResource("org/monday/domain/Customer.hbm.xml");
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
            .buildServiceRegistry();
SessionFactory sf = config.buildSessionFactory(serviceRegistry);

在此方法中默认使用hibernate.properties文件来进行配置,而hibernate.properties文件中不能添加映射文件(.hbm.xml),所以只能用.addResource("org/monday/domain/Customer.hbm.xml")来添加映射文件,这里必须是全路径。

使用如下方法时,读取hibernate.cfg.xml时会出错(找不到元素 'hibernate-configuration' 的声明)
Unable to perform unmarshalling at line number 4 and column 26 in RESOURCE hibernate.cfg.xml
可能是这个版本对DTD不识别,或者是方法运用错误。
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                .configure()    //想通过这个来读取hibernate.cfg.xml来进行配置
                .buildServiceRegistry();
SessionFactory sf = new MetadataSources( serviceRegistry )            
            .buildMetadata()
            .buildSessionFactory();

C 在4.0及以上版本中,用hibernate.cfg.xml来创建sessionFactory的方法
         private static final SessionFactory sessionFactory = buildSessionFactory();
                private static ServiceRegistry serviceRegistry;    
                Configuration configuration = new Configuration();
                configuration.configure();
                serviceRegistry = new ServiceRegistryBuilder().applySettings(
                                configuration.getProperties()).buildServiceRegistry();
                return configuration.buildSessionFactory(serviceRegistry);

 

参考: http://blog.csdn.net/niuch1029291561/article/details/8244771

http://www.cnblogs.com/lastren/archive/2012/01/29/2331034.html

分享到:
评论

相关推荐

    HibernateSessionFactory 代码

    本篇文章将深入探讨`HibernateSessionFactory`及其在Hibernate中的作用,以及如何使用它来实现增、删、查、改(CRUD)操作。 `SessionFactory`是Hibernate的核心组件,它是线程安全的,负责管理数据库连接和会话。`...

    使用 HibernateSessionFactory 类

    在`HibernateSessionFactory.java`这个文件中,我们可能看到对上述过程的封装,例如创建`SessionFactory`的静态方法,以及提供会话的获取和关闭功能。这样的封装有助于代码的整洁和复用。 在实际应用中,`...

    HibernateSessionFactory.java

    HibernateSessionFactory.java

    SSH整合中 hibernate托管给Spring得到SessionFactory

    SessionFactory中 加入为了能得到同一个Session”表明本文要讨论的是在使用Spring框架整合Hibernate时,如何实现Spring管理Hibernate的SessionFactory对象,以便能够共享同一个数据库连接会话。 SSH框架指的是...

    spring配置sessionFactory(spring3.2.3+hibernate4.2.2)

    SessionFactory是Hibernate的核心组件,它负责创建Session对象,而Session则是与数据库交互的接口。 首先,我们需要在项目中添加Spring和Hibernate的依赖。Spring的jar包通常包括spring-context、spring-beans、...

    Hibernate 操纵持久化对象

    Hibernate允许开发者定义对象的生命周期回调方法,如preInsert()、postInsert()、preUpdate()等,以便在对象状态改变时执行特定的业务逻辑。 **九、懒加载与立即加载** 懒加载(Lazy Loading)是一种优化策略,只在...

    Hibernate操作持久化对象

    这个类展示了如何使用Hibernate的简单操作,如`get()`, `add()`, `del()`, 和 `update()`方法,这些方法调用了基类的抽象方法,进一步简化了DAO层的实现。 在Hibernate中,对象的状态分为瞬时状态、持久状态和脱管...

    HibernateSessionFactory.java Hibernate使用的整合的工具文件

    Session s= HibernateSessionFactory.getSession(); 就是Hibernate的工具java类

    Hibernate入门到精通

    SessionFactory 是 Hibernate 的 Session 工厂对象,它提供了一些方法来创建和管理 Hibernate 的 Session 对象。SessionFactory 对象是 Hibernate 的核心组件之一。 Hibernate 的优点 Hibernate 有很多优点,它...

    新Hibernate SessionFactory().getCurrentSession()猫腻

    然而,`SessionFactory.getCurrentSession()`方法提供了一种不同的方式来获取Session,这种方式旨在支持基于容器的事务管理。 使用`SessionFactory.getCurrentSession()`,Hibernate会尝试绑定Session到当前的JTA...

    HibernateSessionFactory

    用于获得Session会话及关闭Session会话

    javaEE SSH三大框架整合,Spring整合Hibernate,将Hibernate的SessionFactory对象交给Spring容器管理(方案一,不推荐)-附件资源

    javaEE SSH三大框架整合,Spring整合Hibernate,将Hibernate的SessionFactory对象交给Spring容器管理(方案一,不推荐)-附件资源

    hibernate操作数据库笔记

    注:由于SessionFactory是重量级对象,很耗资源,所以在获取SessionFactory对象时最好用单例模式获取,以确保一个应用中只有一个SessionFactory对象存在和线程安全,由于Session对象 是非线程安全的(尽管创建一个...

    springboot集成hibernate

    `getSession()`方法获取当前Session,`beginTransaction()`和`commit()`分别用于开始和提交事务,而`save()`方法用于保存实体到数据库。 最后,我们可以在Service或Controller中注入UserDAO,调用其方法来实现业务...

    精通Hibernate:Java对象持久化技术详解.pdf

    总的来说,《精通Hibernate:Java对象持久化技术详解》是一本全面覆盖Hibernate的书籍,无论是初学者还是经验丰富的开发者,都能从中获取宝贵的知识,提升自己的技能。通过学习,读者不仅能掌握Hibernate的基本用法...

Global site tag (gtag.js) - Google Analytics