`

Hibernate4.X的变化

 
阅读更多
  • 创建SessionFactory时buildSessionFactory()方法过期
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的方法

从Hibernate 4之后,Configuration类中,原先常用的,获取SessionFactory的方法buildSessionFactory()被标记为过时,官方建议使用buildSessionFactory(ServiceRegistry sr)这个方法来获取SessionFactory。新的方法,我理解,是因为用户有可能(虽然很罕见)根据不同的cfg.xml文件来创建出不同的Configuration对象实例,新的方法可以根据不同的实例来构建出不同的ServiceRegistry,进而得到不同需求的sessionFactory.

这样做的具体用例我虽然还没有遇到,但是可以想象,新的方法对分布式数据库将有良好的支持。

比如,一个分布式数据库系统中包含了分布在多个不同主机,不同类型的数据库,我们开发一个WEB应用,要求对这些数据库都要进行操作,假如这些数据库的信息分别写在了多个cfg.xml中,那么,我们就可以根据这些不同的配置文件,生成针对不同数据库SessionFactory,并将其保存在一个Map中,数据库名作为键值,这样我们就可以在实现DAO层的时候,根据访问不同数据库的需要而获取到不用的Session.

 

 

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

本人测试代码:
package cn.com.zyx.model;

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

public class StudentTest {
public static void main(String[] args) {
	Student s = new Student();
	s.setName("111");
	s.setSex("男");
	
	Configuration cfg = new Configuration();
	cfg.configure();
	//SessionFactory sf=cfg.configure().buildSessionFactory();//*过期方法*解析Hibernate.cfg.xml 然后返回一个已经拥有配置选项的Configuration
	ServiceRegistry sr=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
	//SessionFactory类似数据库库的一个Connection
	SessionFactory sf =cfg.buildSessionFactory(sr);
	//打开一个连接
	Session session =sf.openSession();
	//开始一个事务
	session.beginTransaction();
	session.save(s);
	//获得一个事务,并提交
	session.getTransaction().commit();
	//关闭连接
	session.close();
	//关闭工厂
	sf.close();
	
}
}


  • Error applying BeanValidation relational constraints错误的解决
错误示例:
Exception in thread "main" org.hibernate.HibernateException: Error applying BeanValidation relational constraints
at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.applyRelationalConstraints(BeanValidationIntegrator.java:219)
at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:126)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:303)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1750)
at cn.com.zyx.model.StudentTest.main(StudentTest.java:20)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.applyRelationalConstraints(BeanValidationIntegrator.java:208)
... 4 more
Caused by: org.hibernate.HibernateException: Unable to build the default ValidatorFactory
at org.hibernate.cfg.beanvalidation.TypeSafeActivator.getValidatorFactory(TypeSafeActivator.java:524)
at org.hibernate.cfg.beanvalidation.TypeSafeActivator.applyDDL(TypeSafeActivator.java:119)
... 9 more
Caused by: javax.validation.ValidationException: Unable to instantiate Configuration.
at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:272)
at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111)
at org.hibernate.cfg.beanvalidation.TypeSafeActivator.getValidatorFactory(TypeSafeActivator.java:521)
... 10 more
 
在hibernate.hbm.xml中加上
<property name="javax.persistence.validation.mode">none</property>
javax.persistence.validation.mode默认情况下是auto的,就是说如果不设置的话它是会自动去你的classpath下面找一个bean-validation**包,但是找不到,所以beanvalitionFactory错误。
 
我有这个问题,,,怎么都解决不了,,我进行了分段实验,最终知道,就是spring配置文件里德sessionfactory创建出现的问题,无法实例化,,愁死了,,我用tomcat 和 其他服务器都可以正常运行,就是不能用JUnit 测试
最后总结:web工程当作java工程用时需要添加上边这句,java工程不需要,没有出现相应的错误
Hibernate4.1整合spring3.1不能做Dao测试
 
在hibernate.hbm.xml中加上
<property name="javax.persistence.validation.mode">none</property>
 
javax.persistence.validation.mode默认情况下是auto的,就是说如果不设置的话它是会自动去你的classpath下面找一个bean-validation**包,但是找不到,所以beanvalitionFactory错误
那个是用来做数据验证的,默认情况是auto,就会用JPA hibernate-validator来验证,如果不配成none的话,你需要在项目中加入hibernate-validator相关的两个jar包,具体的可以看下官方文档···
 
 
 
分享到:
评论

相关推荐

    spring4.x________

    Spring 4.x 是一个重要的Java框架,专注于简化企业级应用程序开发。这个版本的Spring框架引入了许多新特性,改进和优化,以适应不断变化的开发需求和技术趋势。在本文中,我们将深入探讨Spring 4.x的核心特性、优势...

    hibernate-Annotation.jar

    **Hibernate 4.x及更高版本的变化** 从Hibernate 4.x开始,Annotation已经成为主要的映射方式,XML配置逐渐退居二线。新的版本集成了对Annotation的支持,因此,对于新项目来说,直接使用注解进行对象关系映射是...

    精通Spring+4.x++企业应用开发实战

    4. **数据访问**:Spring提供了多种数据访问抽象层,包括JDBC、ORM(如Hibernate)、NoSQL数据库支持等,简化了数据库操作。 5. **安全性**:Spring Security是一个强大的安全框架,提供了认证、授权等多种安全相关...

    Spring 3.x 中文开发手册.pdf

    虽然文档中提到对 Hibernate 4 的支持不感兴趣,但 Spring 3.x 对 Hibernate 4 提供了更好的支持,增强了与 ORM 技术的整合能力,为开发者提供了更多的选择。 #### 七、Spring 测试框架 Spring 3.x 的测试框架进行...

    hibernate 3.1+tomcat 5.5.x(配置jndi)

    随着Tomcat从5.0版本升级到5.5.x版本,其配置发生了诸多变化,特别是对Tomcat JNDI的配置方式产生了显著的影响。这对希望在Hibernate安装中利用Tomcat JNDI提供的DataSource配置便利性的开发者来说尤为重要。同时,...

    Drools4.x实例

    6. 集成能力:Drools4.x可以轻松地与Spring、Hibernate等Java企业级框架集成,使得在现有应用中引入规则引擎变得简单。此外,它还提供了RESTful API,可以与其他系统进行交互。 7. 性能优化:在Drools4.x中,对性能...

    hibernate需要的所有jar包

    8. **DOM4J**: 一个Java的XML处理库,Hibernate使用它来解析和生成XML配置文件,对应的JAR为`dom4j-x.x.x.jar`。 9. **EclipseLink**: 如果你同时使用了JPA,可能会有EclipseLink的相关JAR,虽然不是Hibernate核心...

    HibernateSynchronizer(2.3.1 & 3.1.9)

    3. **更广泛的支持**:不仅支持Hibernate 3.x,还扩展到4.x和5.x版本,适应了Hibernate框架的演进。 4. **增强的错误处理**:3.1.9版的错误提示更加明确,帮助开发者快速定位问题,提高了开发效率。 四、Jeecms...

    hibernate各个版本下载地址

    4. **3.2.x系列** - **3.2.7.ga (2009-06-03)**:这个版本修复了一些bug,并增强了安全性。 - **3.2.5.ga (2007-07-31)**:这个版本对之前的版本进行了优化,并加入了一些新特性。 - …… - **3.2.0.ga (2006-10...

    Hibernate 3.1+Tomcat 5.5.X(配置JNDI篇)

    【标题】:“Hibernate 3.1+Tomcat 5.5.X(配置JNDI篇)” 【描述】:文章介绍了在Tomcat 5.5.X版本中如何配置Hibernate 3.1,特别是关于JNDI(Java Naming and Directory Interface)的设置方法。 【标签】:...

    spring-framework-5.1.x.zip

    5.1.x版本是Spring发展中的一个重要里程碑,它在前一版本的基础上进行了诸多优化和增强,以适应不断变化的开发需求。本文将对Spring Framework 5.1.x进行深入剖析,探讨其核心组件、新特性和最佳实践。 一、Spring...

    HibernateTools-3.2.0.GA

    9. **版本兼容性**:HibernateTools 3.2.0.GA对应的是Hibernate的一个较旧版本,可能不支持最新版的Hibernate特性,但仍然适用于基于Hibernate 3.x的项目。 通过安装和使用HibernateTools-3.2.0.GA,开发者可以更...

    Hibernate 3.3.2

    最后,我们来到Hibernate 4.3.6.Final,这是4.x系列的一个稳定版本,包含了很多重要的改进和新特性: 1. **Java 8支持**:完全兼容Java 8,利用了新语言特性的优势,如Lambda表达式。 2. **HHH(Hibernate ORM)...

    Myeclipse 10.0 + Hibernate 4.3.5 连接 Oracle 11G的演示代码

    在Hibernate 4.x中,推荐使用`SessionFactory`的工厂类`Configuration`来构建会话工厂,如`SessionFactory sf = new Configuration().configure().buildSessionFactory();` Oracle 11G是Oracle数据库的一个版本,...

    Hibernate Developer Guide

    - 使用命令行工具:`java -jar hibernate-tools-X.Y.Z.jar hbm2ddl -db hsqldb -dialect org.hibernate.dialect.HSQLDialect -input hibernate-mapping.hbm.xml` - 通过编程方式调用。 #### 四、事务和并发控制 ...

    JPA + Hibernate 3 CRUD操作历史审计日志的解决方案

    &lt;version&gt;5.x.y.Final&lt;/version&gt; &lt;!-- 使用适合项目的版本 --&gt; ``` 配置完成后,我们需要在Hibernate的配置文件(如hibernate.cfg.xml或application.yml)中启用Envers,并指定审计表的命名策略: ```xml &lt;!-- ...

    hibernate-2.1rc1.zip

    本压缩包文件"hibernate-2.1rc1.zip"是Hibernate 2.1的候选发布版,被誉为一个相当稳定且bug较少的版本,对于那些需要使用Hibernate 2.x系列的开发者来说,无疑是一个可靠的资源库。 Hibernate 2.1是Hibernate发展...

    Spring 3.x企业应用开发实战光盘源码(下)

    在这个上下文中,"Spring 3.x"指的是Spring框架的第三个主要版本,它在2010年发布,包含了许多重要的改进和增强,例如对Java配置的支持、AOP(面向切面编程)的改进以及与Hibernate等其他框架的集成优化。...

    hibernate新版本

    例如,Hibernate 4.x版本引入了JPA 2.1规范的支持,提供了更好的类型安全的查询API(Criteria API)。 2. **API变更**:新版本可能会对API进行调整,包括接口方法的增删改,这可能需要开发者更新代码以适应新版本。...

Global site tag (gtag.js) - Google Analytics