Hibernate之旅三:hibernate.cfg.xml详解
1. hibernate.cfg.xml的介绍
直接给大家一个链接,该文章对配置文件hibernate.cfg.xml做了非常详尽的介绍:
http://blog.csdn.net/qiaqia609/article/details/9456489
2.hibernate可编程式配置
①在配置cfg.xml时,如果不想在里面配置hbm.xml,可以采用以下这种方式配置:
Configuration cfg = new Configuration().addResource("UserInfo.hbm.xml");
②在①中的配置方式并不推荐,这里有一个更好的选择,指定被映射的类,让Hibernate去寻找映射定义文件:
Configuration cfg = new Configuration().addClass(org.hibernate.entity.UserInfo.class);
③通过编程方式指定配置属性:
Configuration cfg = new Configuration().
addClass(org.hibernate.entity.UserInfo.class).
setProperty("hibernate.order_updates", "true").
setProperty("hibrenate.dialect","org.hibernate.dialect.MySQLInnoDBDialect");
这里只演示了一部分配置,其他的配置直接使用setProperty添加即可。需要注意的一点是Configuration实例被设计为启动期间对象,一旦SessionFactory创建完成Configuration就会被丢弃。
package org.hibernate.h4; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.entity.UserInfo; /** * * 功能:演示hibernate的基本配置 * * @author liaody * @version 1.0 * @date 2017年3月11日 下午9:32:16 */ public class Chart2 { /** * default constructor */ public Chart2() { } public static void main(String[] args) { new Chart2().configuration3(); } /** * * <p> * 可编程式的配置:如果不想在配置cfg.xml的时候配置hbm.xml,可以使用这种配置方式。<br> * 一般不推荐使用这种方式</br> * </p> * * @2017年3月11日 下午9:34:20 */ public void configuration1() { Configuration cfg = new Configuration().addResource("UserInfo.hbm.xml"); Session session = cfg.configure().buildSessionFactory() .getCurrentSession(); UserInfo user = new UserInfo(); user.setUserName("zhangsan"); user.setUserName("zhangsan"); Transaction transaction = session.beginTransaction(); session.save(user); transaction.commit(); } /** * * <p> * 可编程式的配置:让Hibernnte自动寻找映射定义文件,这种方式消除了对文件名的硬编码。。<br> * </p> * * @2017年3月11日 下午9:34:20 */ public void configuration2() { // 让Hibernnte自动寻找映射定义文件 Configuration cfg = new Configuration() .addClass(org.hibernate.entity.UserInfo.class); Session session = cfg.configure().buildSessionFactory() .getCurrentSession(); UserInfo user = new UserInfo(); // 必须设置主key才能够进行删除 // user.setUserId(5); user.setUserName("weiy"); user.setUserPassword("weiy"); Transaction transaction = session.beginTransaction(); session.save(user); transaction.commit(); } /** * * <p> * 可编程式的配置:通过编程的方式来指定配置属性。<br> * </p> * * @2017年3月11日 下午9:34:20 */ public void configuration3() { // Configuration 实例被设计为start-up对象,一旦SessionFactory创建完成它被丢弃了 Configuration cfg = new Configuration() .addClass(org.hibernate.entity.UserInfo.class) .setProperty("hibernate.order_updates", "true") .setProperty("hibrenate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect"); Session session = cfg.configure().buildSessionFactory() .getCurrentSession(); UserInfo user = new UserInfo(); // 必须设置主key才能够进行删除 user.setUserId(5);// 按照数据库直接加1发番号,并不会按这个数字设置 user.setUserName("weiy"); user.setUserPassword("weiy"); Transaction transaction = session.beginTransaction(); session.save(user); transaction.commit(); } }
3.与数据库连接
与数据库连接有两种方式,一种是JDBC,另一种是Datasource。
①JDBC的配置
<!-- JDBC驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库用户与密码 -->
<property name="hibernate.connection.username">user1</property>
<property name="hibernate.connection.password">user1</property>
<!-- JDBC URL并解决数据库乱码问题 -->
<property name="hibernate.connection.url">
<![CDATA[jdbc:mysql://localhost:3306/hibernatedb?useUnicode=true&characterEncoding=utf8]]>
</property>
②数据源DataSource配置
hibernate.connection.datasource:数据源JNDI名字
hibernate.jndi.url:JNDI提供者的URL
hibernate.jndi.class:JNDI innitalContextFactory类(可选)
hibernate.connection.username:数据库用户(可选)
hibernate.connection.password:数据库用户密码(可选)
③Hibernate自带的连接池算法不纯熟,建议使用工业级的连接池
<!-- Hibernate自带的连接池算法不纯熟,这里使用C3P0 -->
<property name="hibernate.cp30.min_size">5</property>
<property name="hibernate.cp30.max_size">20</property>
<property name="hibernate.cp30.timeout">1800</property>
<property name="hibernate.cp30.max_statement">50</property>
4.其它可选配置
hibernate.dialect:指定数据库方言,允许Hibernate针对特定的数据库生成优化的sql
hibernate.show_sql:输出所有SQL语句到控制台,另外还有一个选项是把org.hibernate.SQL这个log category设置为debug
hibernate.format_sql:在log和控制台打出更加漂亮的sql语句
hibernate.default_schema:在生成的sql中,给指定的schema/tablespace附加于非全限定名的表名上
hibernate.default_catalog:在生成的sql中,给指定的catalog附加于非全限定名的表名上
hibernate.session_factory:SessionFactory创建之后,将自动使用这个名字绑定到JNDI中
hibernate.max_fetch_depth:为单向关联(一对一,多对一)的外连接抓取数设置最大深度,值为0 意味着将关闭默认的外连接抓取。建议取值找0到3之间
hibernate.default_batch_fetch_size:为Hibernate关联的批量抓取设置默认的数量。建议取值为4,6,8,16
hibernate.default_entity_mode:为由这个SessionFactory打开的所有Session指定默认的实体表现模式
hibernate.order_updates:强制Hibernate按照被更新数据的主键,为sql更新排序。这么做将减少在高并发系统中事务的死锁
hibernate.generate_statistics:如果开启,Hibernate将手机有助于性能调节的统计数据
hibernate.use_identifier_rollback:如果开启,在对象呗删除是生成的标识属性将被设为默认值
hibernate.use_sql_comments:如果开启,Hibernate将在sql中生成有助于调试的注释信息,默认为false
5.总结
hibernate.cfg.xml里面的配置可以有很多,有时候如果配置较为简单可以使用properties文件配置,不一定非得使用cfg.xml文件配置,关于缓存,事务策略等配置在用到的时候回介绍。