Hibernate 配置详解(11)
hibernate.session_factory_name_is_jndi
配置hibernate.cfg.xml中SessionFactory的name属性是否作为JNDI名称绑定。默认是true,即默认情况下,只要给SessionFactory配置了name属性,Hibernate就会把这个名字绑定到JNDI上。关于这个的配置,请看:
http://blog.csdn.net/stefwu/article/details/10186077
如果设置了
Hibernate.session_factory_name_is_jndi false
那么随便在什么地方为
SessionFactory
设置
name
,都不会做任何绑定了(也就不会再启动
hibernate
的时候报错了)。
hibernate.jdbc.use_get_generated_keys
配置hibernate是否通过PreparedStatement的getGeneratedKeys()方法得到数据库生成的ID值。在一般情况下,将该值设置为true可以提高一些性能,当然,数据库本身提供的驱动也得支持getGeneratedKeys()方法。默认情况下,hibernate通过数据库的DatabaseMetaData的supportsGetGeneratedKeys()方法返回的值作为默认值。所以一般情况下该属性不用手动设置,hibernate会选择最好的方式。
那么假如数据库驱动不支持getGeneratedKeys方法,Hibernate又会怎么处理这个生成的id呢?很有趣,简单做个实验,设置:
hibernate.jdbc.use_get_generated_keys false
再任意创建一个对象,设置其id生成策略为native。比如我现在用的数据库是MYSQL,驱动是mysql-connector-java-5.1.24-bin.jar(这个驱动本身是支持getGeneratedKeys的):
@Test
public void testSave() {
Session session = HibernateUtil.getInstance().getSession();
session.beginTransaction();
session.save(new User());
session.getTransaction().commit();
session.close();
}
运行测试,控制台输出:
315 [main] DEBUG org.hibernate.SQL - insert into USER (name, age, borndate, married) values (?, ?, ?, ?) 330 [main] DEBUG org.hibernate.SQL - select last_insert_id()
效果很明显,
hibernate
只能使用
last_insert_id()
函数来得到最后插入的值,效率低,而且在高并发情况下易出错。
所以,最好还是将该配置的值留给hibernate自己去选择。
hibernate.hbm2ddl.auto
这个配置项应该所有学习hibernate的人都应该用过吧,该属性可以配置hibernate是否根据映射文件自动生成数据库表的生成策略。一般是用在先有Java对象再生成表的项目中(也存在快速原型设计)中。该配置可选的值有:vaildate、update、create和create-drop,除此之外填的任何值都没有实际意义,相当于不自动生成(none)。
下面分别简单总结一下几种选项的功能:
1,create-drop:在hibernate正常启动的时候创建表(等同于create)
1,什么是正常启动:buildSessionFactory()调用成功
2,创建哪些表:创建hibernate这次管理的对象对应的表
3,如果表已经存在:如果是hibernate要管理的对象对应的表,删除源表,重新创建表
2,create:在hibernate正常启动的时候创建表
同上
3,update:在hibernate正常启动的时候修改表的结构:
1,修改哪些表:hibernate这次管理的对象对应的表
2,如果表已经存在:只修改表结构,不删除/重建表
3,如果增加一列:直接增加一列
4,如果删除一列:不管
5,如果修改一列的类型:尝试修改该列的类型,如果修改失败,发出警告
4,validate:在hibernate正常启动的时候验证表的结构,如果不匹配直接报错,hibernate无法启动。
其中要注意一点的就是在很早的版本的时候,hibernate已经把create-drop和create都统一成了启动时先删除所有的表,再重新创建表这种策略了。在平时的开发中,个人一般习惯在白盒阶段设置为create(当然需要把系统拆成一个个小模块启动,要不对象多了,启动时间太长),黑盒阶段设置为update,在生产环境设置为validate。在生产环境不建议使用update,原因前面说了,update遇到属性类型修改,如果更新不了表中列的类型,不会报错,只会给一个警告,这确实挺危险的。
另外,hibernate还提供了直接把映射文件导出为SQL文件的方式。要导出SQL,我们只需要用到两个类:SchemaExport和SchemaUpdate。从名字上面就能很容易看出来,一个用于生成更新的任务,一个用于生成创建的任务。简单使用代码如下:
/**
* 将删除表/创建表的SQL完整导出
*/
@Test
public void testExport() {
// 要导出SQL,需要知道hibernate管理了哪些domain,所以需要读入配置
Configuration config = new Configuration().configure();
// 要导出SQL,需要知道数据库链接信息,方言等
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.loadProperties("hibernate.properties").buildServiceRegistry();
// 根据Configuration和ServiceRegistry创建一个SchemaExport对象
// setFormat方法用于设置是否对生成的SQL进行格式化,格式化效果和hibernate.format_sql一样
// setOutputFile方法用于设置把生成的SQL输出到哪个文件中
// create方法用于创建SQL,第一个参数用于设置是否将SQL输出到控制台和文件中,
// 第二个参数用于设置是否将此次SQL在数据库上执行
new SchemaExport(serviceRegistry, config).setFormat(true)
.setOutputFile("create.sql").create(true, false);
}
/**
* 将删除表的SQL完整导出
*/
@Test
public void testExportDrop() {
// 要导出SQL,需要知道hibernate管理了哪些domain,所以需要读入配置
Configuration config = new Configuration().configure();
// 要导出SQL,需要知道数据库链接信息,方言等
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.loadProperties("hibernate.properties").buildServiceRegistry();
// drop方法用于创建删除表的SQL,第一个参数用于设置是否将SQL输出到控制台和文件中,
// 第二个参数用于设置是否将此次SQL在数据库上执行
new SchemaExport(serviceRegistry, config).setFormat(true)
.setOutputFile("drop.sql").drop(true, false);
}
/**
* 将修改表结构的SQL完整导出
*/
@Test
public void testExportUpdate() {
// 要导出SQL,需要知道hibernate管理了哪些domain,所以需要读入配置
Configuration config = new Configuration().configure();
// 要导出SQL,需要知道数据库链接信息,方言等
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.loadProperties("hibernate.properties").buildServiceRegistry();
// 根据Configuration和ServiceRegistry创建一个SchemaUpdate对象
SchemaUpdate update=new SchemaUpdate(serviceRegistry, config);
// setFormat方法用于设置是否对生成的SQL进行格式化,格式化效果和hibernate.format_sql一样
update.setFormat(true);
// setOutputFile方法用于设置把生成的SQL输出到哪个文件中
update.setOutputFile("update.sql");
// execute方法用于创建修改表结构的SQL,第一个参数用于设置是否将SQL输出到控制台和文件中,
// 第二个参数用于设置是否将此次SQL在数据库上执行
update.execute(true, false);
}
Hibernate 配置详解(11)的更多相关文章
- Hibernate 配置详解(9)
hibernate.cache.use_structured_entries Hibernate文档上介绍,该属性是用于把对象以一种更易读的方式放到二级缓存中,这样,在对二级缓存进行监控的时候就更容易 ...
- Hibernate 配置详解(5)
9) hibernate.batch_fetch_style: 该配置是hibernate4.2.0新添加的,使用这个设置可以配置hibernate在做batch-fetch的时候,生成SQL的策略. ...
- Hibernate 配置详解(2)
6) hibernate.session_factory_name: 配置一个JNDI名称,通过Configuration对象创建的SessionFactory会绑定到JNDI下该名称中.一般名字格式 ...
- Hibernate 配置详解(8)
hibernate.generate_statistics 这个配置大家应该都很熟悉,用于开启Hibernate统计信息,便于对Hibernate相关性能调试提供数据依据.在开发过程当中,可以把这个选 ...
- Hibernate 配置详解(12) 补充
hibernate.hbm2ddl.import_files_sql_extractor 这个配置项用于补充这篇文章: http://blog.csdn.net/stefwu/article/deta ...
- Hibernate 配置详解(12) 其实我也不想用这么土的名字
hibernate.hbm2ddl.import_files 这个配置用于在hibernate根据映射文件执行DDL之前,如果我们自己设置了要事先运行的SQL文件,hibernate就会先执行这些SQ ...
- Hibernate 配置详解(7)
hibernate.order_updates: Hibernate文档中提到,该配置用于在刷新一级缓存,提交UPDATE的时候,按照每类对象的主键顺序排序后再提交,可以在高并发情况下减少事务死锁的可 ...
- hibernate二级缓存ehcache hibernate配置详解
<!-----------------hibernate二级缓存ehcache------------------------->hibernate配置 <prop key=&quo ...
- Hibernate配置详解
<!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' ...
随机推荐
- win7 下使用cygwin
http://cygwin.com/index.html 还是看官网! 很多用windows的朋友不习惯于用linux的开发环境.虽然很乐意尝试一下,但是往往怕 linux系统打乱了自己的正 ...
- 3-04. 一元多项式的乘法与加法运算(20)(ZJU_PAT 结构体)
题目链接:http://pat.zju.edu.cn/contests/ds/3-04 设计函数分别求两个一元多项式的乘积与和. 输入格式说明: 输入分2行.每行分别先给出多项式非零项的个数.再以指数 ...
- IT行业,需要经常锻炼,开篇从本钱开始
今天下完班,和部门兄弟一起去打了两小时乒乓球,大汗淋漓,很痛快. 败给了两个高手,感觉年龄大了些,灵活性没有以前那么好了. 想想以前读书时,在整个学校都叱诧风云,如今即败给了几个老手,唉. 看来以后要 ...
- HDU 4668 Finding string (解析字符串 + KMP)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意:给出一个压缩后的串,以及一个模式串,问模式串 ...
- Highcharts将数据以图表的形式展现
1.首先将Highcharts插件所需的js跟css样式文件引入项目中,下载地址为:Highcharts.rar 2.在前台页面中添加一个存放图表的容器 <div id="contai ...
- 【Demo 0004】Java基础-类封装性
本章学习要点: 1. Java封装特性; 2. 掌握类的定义: 3. 掌握类的调用方法; 一.封装特性 Java 纯面向对象语言,面向对象语言遵 ...
- Swift - 使用表格组件(UITableView)实现分组列表
1,样例说明: (1)列表以分组的形式展示 (2)同时还自定义分区的头部和尾部 (3)点击列表项会弹出消息框显示该项信息. 2,效果图: 3,代码如下: 1 2 3 4 5 6 7 8 9 ...
- [iOS]简单的APP引导页的实现 (Swift)
在第一次打开APP或者APP更新后通常用引导页来展示产品特性 我们用NSUserDefaults类来判断程序是不是第一次启动或是否更新,在AppDelegate.swift中加入以下代码: func ...
- 《powershell 的版本号所引起的载入 FSharp 编译器问题》基本解决
<powershell 的版本号所引起的载入 FSharp 编译器问题>基本解决 1.FSharp.Core.dll.不光要 Add-Type,还要在编译中引用.可是,在 VS2012 的 ...
- Api之Cors跨域以及其他跨域方式
Web Api之Cors跨域以及其他跨域方式(三) 我们知道ajax不能跨域访问,但是有时我们确实需要跨域访问获取数据,所以JSONP就此诞生了,其本质使用的是Script标签,除JSONP以外还 ...