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文件配置,关于缓存,事务策略等配置在用到的时候回介绍。

 

posted @ 2017-03-11 17:00  元哈哈  阅读(462)  评论(0)    收藏  举报