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' ...
随机推荐
- vs2005及以上版本的程序分发问题
我们使用vs2005及以上版本编译的应用程序(C/C++),在客户机器运行时,会出现: “由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题” 那么,我们怎么解决这个问题呢 ...
- 编写在浏览器中不弹出警告的ActiveX控件
我们在编写ActiveX控件时,如果用在浏览器中,经常都会弹出现在运行的脚本不安全的提示, 如果给客户使用,将会带来极大不便.按照MSDN的介绍通常有两种一种是实现IObjectSafe接口,一种是通 ...
- 自己定义android 4.0以上的对话框风格
做个笔记.这里是Dialog的风格,假设是用AlertDialog创建的,不能直接用.在styles.xml的写法: <style name="DialogWindowTitle&qu ...
- python基础教程_学习笔记1:序列-1
序列 数据结构:通过某种方式组织在一起的数据元素的集合,这些数据元素能够是数字或者字符,甚至能够是其它数据结构. python中,最主要的数据结构是序列. 序列中的每一个元素被分配一个序号--即元素的 ...
- android之写文件到sd卡
1.main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...
- [C#基础] 委托
什么是委托 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有 ...
- [C#基础] 继承
虚方法和覆写方法 虚方法可以使基类的引用访问"升至"派生类中 可以使用基类引用调用派生类的方法,只需满足下面的条件 派生类的方法和基类的方法有相同的签名和返回类型 基类的方法使用v ...
- 14.5.2 Changing the Number or Size of InnoDB Redo Log Files 改变InnoDB Redo Log Files的数量
14.5.2 Changing the Number or Size of InnoDB Redo Log Files 改变InnoDB Redo Log Files的数量 改变InnoDB redo ...
- Oracle dump 分析secondary key
验证secondary key 含有主键列数据 SQL> select object_name,object_id,OBJECT_TYPE from user_objects; OBJECT_N ...
- Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁
相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: ...