`

hibernate4.0 中buildSessionFactory()新方式解惑 - 小刀

 
阅读更多

这段时间刚开始学习Hibernate,到官网下文件包,发现刚出来的hibernate-release-4.0.0.CR6,于是下了下来,对着书上的例子一敲,问题来了...见下图

没办法,又重新进官网下了个hibernate-distribution-3.6.8.Final,发现没有问题。

于是乎......在官网和4.0源文件中穿插研究了几个小时,终于搞明白怎么回事了。

 

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 );
	}
 

 

分享到:
评论
5 楼 1594433168 2012-09-01  
谢谢lz了
4 楼 adaikiss 2012-03-06  
ssqiang 写道
一方法:
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;
}

不错,谢谢
3 楼 ssqiang 2012-01-16  
一方法:
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;
}
2 楼 Projack_Lin 2011-12-29  
你好,请问使用XML配制的方法找到了吗?
1 楼 pengdamao 2011-11-15  
恩恩,不错!

相关推荐

    Hibernate4.0

    ### Hibernate 4.0 使用中的常见错误解析与应对策略 #### ServiceRegistry的引入与使用 在Hibernate 4.0版本中,对原有的架构进行了重大的调整,其中最显著的变化之一便是`ServiceRegistry`的引入。这标志着从...

    Hibernate 4.0版HelloWorld

    本教程将详细介绍如何在Hibernate 4.0版本中创建一个基础的“HelloWorld”项目,这个项目将会演示如何配置Hibernate、建立数据库连接以及执行基本的数据操作。 首先,我们需要设置项目的基础结构。由于项目依赖于...

    (3)Hibernate3.2 中的 one-to-one关系

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联是对象关系映射(ORM)中的一个重要概念,它用于表示两个实体之间一对一的映射关系。本篇将深入探讨Hibernate 3.2中的一对一关系,以及如何在实际项目中...

    Hibernate ORM 新特性之 Service(Registry).

    总结起来,Hibernate ORM 4.0及更高版本中的Service Registry是一个重要的新特性,它提供了更高效的服务管理和访问方式,增强了系统的可扩展性和灵活性。开发者在升级到新版本时,应适应这一变化,以便更好地利用...

    hibernate-annotations-3.4.0.GA+hibernate-distribution-3.3.2.GA-dist

    Hibernate作为Java领域中的一个强大ORM(对象关系映射)框架,为开发者提供了在Java应用程序中操作数据库的强大工具。它允许我们将数据库操作转换为对Java对象的操作,大大简化了开发流程。而Hibernate Annotations...

    hibernate-core-5.0.11.Final.jar

    Hibernate,作为Java领域中最著名的对象关系映射(ORM)框架之一,极大地简化了数据库操作,使得开发者能够以面向对象的方式处理数据。本文将重点探讨`hibernate-core-5.0.11.Final.jar`的核心源码,帮助读者深入...

    Hibernate-Annotation中文教程.pdf

    传统上,Hibernate 的配置依赖于外部 XML 文件,而最近发布的几个 Hibernate 版本中,出现了一种基于 Java 5 注释的更为巧妙的新方法,即 Hibernate Annotation 库。借助新的 Hibernate Annotation 库,即可一次性地...

    hibernate-release-5.2.2.Final.zip

    3. Hibernate 5.2.2.Final新特性: - 改进了查询API,支持JPA 2.2规范。 - 提供了更强大的HQL(Hibernate Query Language)和Criteria API,支持复杂查询。 - 性能优化,包括更快的初始化时间和更好的内存管理。 ...

    hibernate-3.2源代码

    在Hibernate中,对象有三种状态:瞬时态、持久态和脱管态。理解这些状态对于正确操作对象至关重要,例如,只有持久态对象才能参与事务。 六、缓存机制 Hibernate 3.2引入了二级缓存,通过CacheProvider实现,如...

    hibernate-release-4.3.9.Final.rar

    Hibernate,作为Java领域中的一个著名ORM(对象关系映射)框架,它极大地简化了数据库操作,使得开发者能够以面向对象的方式来处理数据库交互。这次我们关注的是Hibernate 4.3.9.Final版本,它包含了“required”...

    Hibernate-Annotation中文教程.docx

    借助新的 Hibernate Annotation 库,即可一次性地分配所有旧映射文件——一切都会按照您的想法来定义——注释直接嵌入到您的 Java 类中,并提供一种强大及灵活的方法来声明持久性映射。 使用 Hibernate 注解的优点...

    Hibernate基本配置演示

    如果是注解方式,实体类中的属性会自动映射到表的列。 4. **SessionFactory创建**: 在代码中使用`Configuration`对象读取`hibernate.cfg.xml`配置,然后创建SessionFactory。 ```java Configuration cfg = new ...

    Hibernate+IDEA 2018 一个hibernate程序

    1. **创建新项目**:在IDEA中创建一个新的Java Web项目。 2. **配置项目**:在配置项目过程中,需要选择Hibernate相关的依赖。IDEA提供了三种方式: - 使用本地的Hibernate JAR包。 - 使用IDEA内置的JAR包(注意...

    hibernate-3.2源码

    3. 查询语言:支持HQL(Hibernate Query Language)和Criteria API,提供面向对象的查询方式。 4. 类型系统:处理Java类型与数据库类型的转换,确保数据的正确存储和检索。 5. 缓存机制:包括一级缓存(Session级别...

    hibernate

    - **自动对象关系映射**:通过配置文件(通常是 XML 文件),Hibernate 能够自动将 Java 对象持久化到数据库中,并能从数据库中加载对象。 **2. Hibernate 架构** - **PO (Persistent Objects 持久化对象)**:这些...

    hibernate中文文档

    Hibernate 是一个开源的对象关系映射(ORM)框架,它为开发者提供了一种将 Java 应用程序中的对象映射到数据库表的方式。通过 Hibernate,开发人员可以使用面向对象的方法来处理数据库操作,而无需直接编写 SQL 语句...

    MyEclipse中hibernate的配置

    ### MyEclipse中Hibernate的基本配置步骤与理解 #### 一、引言 随着软件开发行业的不断发展,ORM(Object-Relational Mapping,对象关系映射)技术已成为连接对象模型与关系型数据库的重要桥梁之一。其中,...

    hibernate的jar包

    Hibernate是一个强大的Java持久化框架,它为开发人员提供了一种简单、高效的方式来管理数据库操作。在Java应用程序中,Hibernate作为对象关系映射(ORM)工具,使得开发者可以通过处理Java对象来间接操作数据库,...

    Hibernate 4.2.1 Release

    在本文中,我们将深入探讨Hibernate 4.2.1版本的主要特点、功能改进以及如何在Eclipse环境中集成和使用。 **1. Hibernate ORM框架概述** Hibernate是一个开源的Java库,它简化了Java应用程序与关系数据库之间的交互...

Global site tag (gtag.js) - Google Analytics