`

Hibernate4获取SessionFactory的新方式

 
阅读更多

在3.X中的方法,在4.X中不在推荐,

 

Hibernate4.0新增了一个ServiceRegistry接口,应用于Hibernate的配置或者服务等将统一向这个ServiceRegistry注册后才能生效。所以需要构建一个ServiceRegistry对象,将配置信息向它注册,然后Configuration对象根据从这个ServiceRegistry对象中获取配置信息生成SessionFactory。

那么这个ServiceRegistry怎么来呢?看看源代码结构就能发现它的来源地了——org.hibernate.service.ServiceRegistryBuilder。

分析一下这个ServiceRegistryBuilder的源文件,得出以下新的构建SessionFactory的方式:

 

Configuration config = new Configuration();
		SessionFactory sf = config.buildSessionFactory(
						new ServiceRegistryBuilder()
						.configure()
						.buildServiceRegistry());

 

 

却发现仍然有问题,居然是读取hibernate.cfg.xml文件出错,异常如下:

[org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'hibernate-configuration'.]

该文件经hibernate3测试通过,不可能出错,难道是要用hibernate-configuration-4.0.dtd?打开浏览器输入地址,发现没有这个文件,无奈,不用xml文件配置,使用hibernate.properties进行配置,修改代码如下:

 

 

	Configuration config = new Configuration();
		SessionFactory sf = config.buildSessionFactory(
						new ServiceRegistryBuilder()
						.buildServiceRegistry());

运行测试通过!

不过,这只是很肤浅的用法,更深入的用法尚在摸索中...

 

简单得出总结,Hibernate4的配置入口不再是Configuration对象,而是ServiceRegistry对象,Configuration对象将通过ServiceRegistry对象获取配置信息(官方说法是为了方便统一管理)。但是使用XML文件进行配置仍有不知名的问题,盼早日明晓。

以上见解仅仅是自己的一份学习笔记,希望能帮助到一些有同样疑惑的朋友,本人也只是刚开始学习Hibernate,其中肯定有不成熟与草率之处,希望各位看到的朋友多多交流指正,谢谢!

 

补充:

更正规与专业的用法可参照Hibernate 4.0源代码中Configuration#buildSessionFactory()的实现:

 

	public SessionFactory buildSessionFactory() throws HibernateException {
		Environment.verifyProperties( properties );
		ConfigurationHelper.resolvePlaceHolders( properties );
		final ServiceRegistry serviceRegistry =  new ServiceRegistryBuilder()
				.applySettings( properties )
				.buildServiceRegistry();
		setSessionFactoryObserver(
				new SessionFactoryObserver() {
					@Override
					public void sessionFactoryCreated(SessionFactory factory) {
					}

					@Override
					public void sessionFactoryClosed(SessionFactory factory) {
						( (StandardServiceRegistryImpl) serviceRegistry ).destroy();
					}
				}
		);
		return buildSessionFactory( serviceRegistry );
	}

方法一:

private static SessionFactory sessionFactory; 
private static 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 void main(String[] args) {
  // qinshiqi
   Configuration configuration = new Configuration(); 
  configuration.configure("/hibernate.cfg.xml");
  
  ServiceRegistry  serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
  SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
 
  
  SessionFactory   sf=HibernateSessionFactory.getSessionFactory();
 }
分享到:
评论

相关推荐

    使用 HibernateSessionFactory 类

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

    HibernateSessionFactory 代码

    首先从`SessionFactory`获取一个`Session`实例,然后调用`save()`或`saveOrUpdate()`方法。 ```java Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); MyEntity ...

    新Hibernate SessionFactory().getCurrentSession()猫腻

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

    springboot集成hibernate

    这种方式允许我们充分利用Hibernate的灵活性,同时避免了JPA的一些限制。在实际项目中,根据需求选择适合的ORM策略是至关重要的。在chapter12-hibernate目录中,可能包含了更多关于这个主题的示例代码和详细说明,供...

    Hibernate4 必备包

    在Java开发中,Hibernate4 是一个重要的里程碑,引入了许多新特性和改进,旨在提高性能和开发效率。本篇文章将深入探讨Hibernate4的核心概念和必备组件。 1. **对象关系映射(ORM)** Hibernate4 提供了一种机制,...

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

    在代码中通过Spring的BeanFactory获取SessionFactory对象的示例代码如下: ```java Resource resource = new ClassPathResource("/WEB-INF/applicationContext.xml"); BeanFactory factory = new XmlBeanFactory...

    hibernate4.x jar

    在实际开发中,你需要配置Hibernate的SessionFactory,创建Session实例,然后通过Session进行数据库操作。例如,你可以使用Session的save()、update()方法来保存和更新对象,使用get()、load()来获取对象,使用...

    HIBERNATE4开发文档,HIBERNATE4的变化

    总结来说,从Hibernate3迁移到Hibernate4,开发者需要注意与Spring的集成方式、缓存配置、事务管理策略以及对session的获取和使用等方面的调整。这些变化旨在提高效率,简化代码,并利用Hibernate4提供的新功能和...

    spring-orm-hibernate4源码

    在Spring中,通常通过SessionFactory的`openSession()`方法获取Session。Spring的事务管理器如`HibernateTransactionManager`会自动管理Session的生命周期。 4. **HibernateTemplate**和**HibernateDaoSupport**: ...

    hibernate4全部架包

    4. **SessionFactory**: SessionFactory是线程安全的,它是Hibernate的工厂类,用于创建Session实例。通常在应用启动时创建一次,然后在整个应用生命周期内复用。 5. **Entity类和注解**: Hibernate 4支持使用Java ...

    springmvc整合hibernate4

    例如,`SessionFactory`获取`Session`,然后使用`Session`的`save()`, `update()`, `delete()`, `load()`或`get()`方法操作数据。 整合步骤通常包括以下部分: 1. 创建实体类:每个实体类对应数据库中的一个表,...

    hibernate4 所有jar包

    Hibernate 4是该框架的一个重要版本,提供了许多新特性和改进,包括更好的性能、增强的缓存机制以及对Java EE 6的支持。 二、核心组件 1. Hibernate Core:这是Hibernate的核心模块,包含ORM的基本功能,如实体管理...

    Hibernate中获取Session的两种方式代码示例

    Hibernate 中获取 Session 的两种方式是:通过 HibernateUtil 工具类和通过 SessionFactory 获取当前 Session。 方式一:通过 HibernateUtil 工具类 HibernateUtil 是一个工具类,用于管理 Session。通过 ...

    hibernate4 全部jar包

    Hibernate 4 是一个流行的Java持久化框架,用于简化数据库交互,尤其在企业级应用程序中广泛使用。SSH(Struts、Spring、Hibernate)是Java Web开发中的经典三层架构,其中Hibernate负责对象关系映射(ORM)。这个...

    hibernate4多租户项目

    Hibernate 4提供了两种主要的多租户实现方式:基于Schema的多租户和基于标识符的多租户。基于Schema的方式,每个租户拥有自己的数据库Schema,保证了数据的物理隔离;而基于标识符的方式则是在同一个Schema下通过...

    struts2+hibernate4+spring4

    此外,随着Java生态系统的发展,现代Web开发更多地转向Spring Boot、Spring MVC等新框架,但了解Struts2、Hibernate4和Spring4的整合对于理解Web开发的历史和演进,以及如何在不同框架间迁移,都是非常有价值的。

    SpringMVC Spring4 Hibernate4 项目搭建

    - **配置整合**:在Spring的配置文件中,引入Hibernate的sessionFactory和数据源,配置事务管理器,使SpringMVC、Spring4和Hibernate4协同工作。 - **单元测试**:使用JUnit和Mockito等工具进行单元测试,验证各...

Global site tag (gtag.js) - Google Analytics