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)的更多相关文章

  1. Hibernate 配置详解(9)

    hibernate.cache.use_structured_entries Hibernate文档上介绍,该属性是用于把对象以一种更易读的方式放到二级缓存中,这样,在对二级缓存进行监控的时候就更容易 ...

  2. Hibernate 配置详解(5)

    9) hibernate.batch_fetch_style: 该配置是hibernate4.2.0新添加的,使用这个设置可以配置hibernate在做batch-fetch的时候,生成SQL的策略. ...

  3. Hibernate 配置详解(2)

    6) hibernate.session_factory_name: 配置一个JNDI名称,通过Configuration对象创建的SessionFactory会绑定到JNDI下该名称中.一般名字格式 ...

  4. Hibernate 配置详解(8)

    hibernate.generate_statistics 这个配置大家应该都很熟悉,用于开启Hibernate统计信息,便于对Hibernate相关性能调试提供数据依据.在开发过程当中,可以把这个选 ...

  5. Hibernate 配置详解(12) 补充

    hibernate.hbm2ddl.import_files_sql_extractor 这个配置项用于补充这篇文章: http://blog.csdn.net/stefwu/article/deta ...

  6. Hibernate 配置详解(12) 其实我也不想用这么土的名字

    hibernate.hbm2ddl.import_files 这个配置用于在hibernate根据映射文件执行DDL之前,如果我们自己设置了要事先运行的SQL文件,hibernate就会先执行这些SQ ...

  7. Hibernate 配置详解(7)

    hibernate.order_updates: Hibernate文档中提到,该配置用于在刷新一级缓存,提交UPDATE的时候,按照每类对象的主键顺序排序后再提交,可以在高并发情况下减少事务死锁的可 ...

  8. hibernate二级缓存ehcache hibernate配置详解

    <!-----------------hibernate二级缓存ehcache------------------------->hibernate配置 <prop key=&quo ...

  9. Hibernate配置详解

    <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' ...

随机推荐

  1. Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...

  2. 编写生成彩色验证码的Servlet

    利用Ajax实现无刷新的彩色验证码时,也需要编写一个名称为PictureCheckCode.java的Servlet,该类继承HttpServlet,主要通过service()方法生成验证码. 下面将 ...

  3. jsonp与cors跨域的一些理解(转)

    CORS其实出现时间不短了,它在维基百科上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源.而这种访问是被同源策略所禁止的. ...

  4. 给工程师的 10 条哲理(浅薄者迷信运气,强者相信因果,软件复制成本为零,文凭不重要,AWS使得创业成本为零,每个手机都是口袋里的强大电脑)

    无论是主题分布式数据库,微服务,Soylent,尤伯杯,或者矮人要塞,我们试图从物质分离出来炒作,推迟叙事的客人.与尊重有软件工程日报的社论部分客观性. 一位渠道的成员说,“当软件工程每日的意见公布, ...

  5. 事件总线帧---Otto

    我们如果这样一种业务场景.如今在做一款及时聊天应用,我们在聊天页面进行收发信息.同一时候也要实时更新前一页面的聊天记录,这时我们该怎样去实现?说说我曾经的实现策略.我使用的是广播接收器BroadCas ...

  6. LLVM每日谈21 一些编译器和LLVM/Clang代码

    作者:闪亮宁(snsn1984) 一些自己的收藏LLVM/Clang代码,而他自己写一些一点点LLVM/Clang译器的代码.在这里把这些代码库分享出来,欢迎大家交流探讨. 1.crange http ...

  7. 非常不错的android应用开发详解在安卓开发中

    我们在苹果开发中,总会看到XCode,Interface Builder,Object-c这如此入耳入随的单词,但往往多数人在认为XCODE看着简单,InterfaceBuilder好似操作, 而Ob ...

  8. Typings实现智能

    在Visual Studio Code中通过Typings实现智能提示功能   前言 我们知道在IDE中代码的智能提示几乎都是标配,虽然一些文本编辑器也有一些简单的提示,但这是通过代码片段提供的.功能 ...

  9. thinkphp3.2

    1.安装WAMPServer,到D:\wamp\. 2.下载ThinkPHP3.2.2核心版.解压缩后,放到D:\wamp\www\MyWeb\.打开浏览器,输入网址:http://localhost ...

  10. tomcat各版本和jsp、jstl、servlet的依赖关系(转)

    Servlet / JSP / Tomcat  Version  Servlet/ JSP    Tomcat  2.5/2.1 6.0.18 2.4/2.0 5.5.27 2.3/1.2 4.1.3 ...