`

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包,具体的可以看下官方文档···
 
 
 
分享到:
评论

相关推荐

    spring chm文档

    7.10.4. ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. ...

    Spring 2.0 开发参考手册

    7.10.4. ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    7.10.4. ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量 ...

    2013年最全的JAVA面试题集,内部资料,绝对能帮助到你,不要后悔哦。

    4. 运行时异常与一般异常有何异同?(难度1级) 5.作用域public,private,protected,以及不写时的区别?(难度1级) 6.Java 有几种修饰符?默认的是什么? 7. final, finally, finalize的区别?(难度1级) 8.float型...

    crud:一个用于springboot 2.x的CRUD入门应用程序

    由于现在前端mmvc框架和后台 no-sql 的流行, json 的使用量激增,要拥抱这种变化,我觉得有必要选择更灵活的持久层框架,而 hibernate 的强关系模型和 mybatis 的 xml 配置文件,降低了这种灵活性。经过大量考察和...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    stats_tracker

    简单的 Bash 3 友好脚本,每 x 秒捕获一次“显示全局状态”并显示值的变化。 仅显示在样本之间变化的值。 需要 2 个参数 延迟 - 在样本之间进入Hibernate状态的秒数。 默认为 2 regex - 传递给 egrep 的正则...

    ga-z270x-ug:技嘉Z270X-UG“ Hackintosh”

    大苏尔(11.0) 支持的机型为iMac 17,x和iMac 18,x。 需要v0.6.3才能启动此版本。 我没有更新,也没有使用Big Sur的打算。 关于 ,WhateverGreen存在兼容性问题。 大苏尔有很多变化。 您启动Big Sur时遇到的任何...

    千方百计笔试题大全

    4、float 型float f=3.4是否正确? 8 5、语句float f=1.3;编译能否通过? 8 6、short s1 = 1; s1 = s1 + 1;有什么错? 8 7、Java 有没有goto? 8 8、int 和Integer 有什么区别? 9 9、&和&&的区别? 9 10、简述逻辑操作...

    java源码包4

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    支持多数据库的ORM框架ef-orm.zip

    IQueryableEntity允许你将一个实体直接变化为一个查询(Query),在很多时候可以用来完成复杂条件下的数据查询。比如 ‘in (?,?,?)’, ‘Between 1 and 10’之类的条件。 xxQL有着拼装语句可读性差、编译器无法...

    《面向对象编程与设计(Java)》课后作业及参考解答.pdf

    1/7 页 《面向对象编程与设计(Java) 》课后作业及参考解答 1.1.1 第一周 课程(9 月 4 日)的课后作业及参考解答 1、 请用 Java 程序示例说明什么是面向过程的程序设计方法、什么是面向对象的程序 设计方法?...

    java面试宝典

    21、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 10 22、我们在web 应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上...

    java源码包---java 源码 大量 实例

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

Global site tag (gtag.js) - Google Analytics