hibernate框架配置文件详解

1 orm元数据配置文件(映射文件)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 配置表与实体的关系 -->
<!-- package属性:填写一个包名。在元素内部凡是需要书写完整类名得属性,可以直接写简单类名就可以了 -->
<hibernate-mapping package="www.test.domain">
    <!--Class元素:配置实体与表得对应关系得
            name:完整类名
            table:数据库表名
      -->
    <class name="Customer" table="cst_customer">
    <!--id:配置主键映射得属性
            name:填写主键对应得属性名
            column:填写表中得主键得列名   默认值:列名会默认使用属性名
            type:填写列(属性)得类型。hibernate会自动检测实体的属性类型
                 每个类型有三种写法:分别是java类型 | hibernate类型 | 数据库类型
                java类型:             
                <property name="cust_name" column="cust_name" type="java.lang.String"></property>
                hibernate类型:
                <property name="cust_name" column="cust_name" type="string"></property>
                数据库类型:
                <property name="cust_name" column="cust_name" >
                    <column name="cust_name" sql-type="varchar"></column>
                </property>
            
                注意:不建议指定,自动检测实体属性类型就可以。
            
            not-null(可选):配置该属性(列)是否不能为空,默认值false默认可以为空
                <property name="cust_name" column="cust_name" not-null="true"></property>
            
            length(可选):配置数据库中列的长度。 默认值:使用数据库类型的最大长度 varchar默认最大长度255。
      -->
        <id name="cust_id" column="cust_id" >
        <!-- generator:主键生成得策略(后面讲) -->
            <generator class="native"></generator>
        </id>
        
        <!-- property:配置除了id之外得普通属性映射
                    name:填写属性名
                    column(可选):填写属性对应得列名 默认值:列名会默认使用属性名
                    type:填写列(属性)得类型。hibernate会自动检测实体的属性类型
                         每个类型有三种写法:分别是java类型 | hibernate类型 | 数据库类型
                        java类型:             
                        <property name="cust_name" column="cust_name" type="java.lang.String"></property>
                        hibernate类型:
                        <property name="cust_name" column="cust_name" type="string"></property>
                        数据库类型:
                        <property name="cust_name" column="cust_name" >
                            <column name="cust_name" sql-type="varchar"></column>
                        </property>
                    
                        注意:不建议指定,自动检测实体属性类型就可以。
                    
                    not-null(可选):配置该属性(列)是否不能为空,默认值false默认可以为空
                        <property name="cust_name" column="cust_name" not-null="true"></property>
                    
                    length(可选):配置数据库中列的长度。 默认值:使用数据库类型的最大长度 varchar默认最大长度255。
                         
         -->
        <property name="cust_name" column="cust_name" length=""></property>
        <property name="cust_source" column="cust_source"></property>
        <property name="cust_industry" column="cust_industry"></property>
        <property name="cust_level" column="cust_level"></property>
        <property name="cust_linkman" column="cust_linkman"></property>
        <property name="cust_phone" column="cust_phone"></property>
        <property name="cust_mobile" column="cust_mobile"></property>
    </class>
</hibernate-mapping>

一对多&多对一关系映射

一的一方的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 配置表与实体的关系 -->
<!-- package属性:填写一个包名。在元素内部凡是需要书写完整类名得属性,可以直接写简单类名就可以了 -->
<hibernate-mapping package="www.test.domain">
    <!--Class元素:配置实体与表得对应关系得
            name:完整类名
            table:数据库表名
      -->
    <class name="Customer" table="cst_customer">
    <!--id:配置主键映射得属性
            name:填写主键对应得属性名
            column:填写表中得主键得列名   默认值:列名会默认使用属性名
            type:填写列(属性)得类型。hibernate会自动检测实体的属性类型
                 每个类型有三种写法:分别是java类型 | hibernate类型 | 数据库类型
                java类型:             
                <property name="cust_name" column="cust_name" type="java.lang.String"></property>
                hibernate类型:
                <property name="cust_name" column="cust_name" type="string"></property>
                数据库类型:
                <property name="cust_name" column="cust_name" >
                    <column name="cust_name" sql-type="varchar"></column>
                </property>
            
                注意:不建议指定,自动检测实体属性类型就可以。
            
            not-null(可选):配置该属性(列)是否不能为空,默认值false默认可以为空
                <property name="cust_name" column="cust_name" not-null="true"></property>
            
            length(可选):配置数据库中列的长度。 默认值:使用数据库类型的最大长度 varchar默认最大长度255。
      -->
        <id name="cust_id" column="cust_id" >
        <!-- generator:主键生成得策略(后面讲) -->
            <generator class="native"></generator>
        </id>
        
        <!-- property:配置除了id之外得普通属性映射
                    name:填写属性名
                    column(可选):填写属性对应得列名 默认值:列名会默认使用属性名
                    type:填写列(属性)得类型。hibernate会自动检测实体的属性类型
                         每个类型有三种写法:分别是java类型 | hibernate类型 | 数据库类型
                        java类型:             
                        <property name="cust_name" column="cust_name" type="java.lang.String"></property>
                        hibernate类型:
                        <property name="cust_name" column="cust_name" type="string"></property>
                        数据库类型:
                        <property name="cust_name" column="cust_name" >
                            <column name="cust_name" sql-type="varchar"></column>
                        </property>
                    
                        注意:不建议指定,自动检测实体属性类型就可以。
                    
                    not-null(可选):配置该属性(列)是否不能为空,默认值false默认可以为空
                        <property name="cust_name" column="cust_name" not-null="true"></property>
                    
                    length(可选):配置数据库中列的长度。 默认值:使用数据库类型的最大长度 varchar默认最大长度255。
                         
         -->
        <property name="cust_name" column="cust_name"></property>
        <property name="cust_source" column="cust_source"></property>
        <property name="cust_industry" column="cust_industry"></property>
        <property name="cust_level" column="cust_level"></property>
        <property name="cust_linkman" column="cust_linkman"></property>
        <property name="cust_phone" column="cust_phone"></property>
        <property name="cust_mobile" column="cust_mobile"></property>
        <!-- 集合,一对多关系,在配置文件中配置 -->
        <!-- 
            name属性:集合属性名
            column属性: 外键列名
            class属性: 与我关联的对象完整类名
         -->
          <!-- 
             级联操作:    cascade
                 save-update: 级联保存更新
                 delete:级联删除
                 all:save-update+delete
             级联操作: 简化操作.目的就是为了少写两行代码.
          -->
          <!-- inverse属性: 配置关系是否维护. 
                  true: customer不维护关系
                  false(默认值): customer维护关系
                  
              inverse属性: 性能优化.提高关系维护的性能.
              原则: 无论怎么放弃,总有一方必须要维护关系.
              一对多关系中: 一的一方放弃.也只能一的一方放弃.多的一方不能放弃.
          -->
         <set name="linkMans" inverse="true">
             <key column="lkm_cust_id"></key>
             <one-to-many class="LinkMan"/>
         </set>
    </class>
</hibernate-mapping>

多的一方的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="www.test.domain">
    <class name="LinkMan" table="cst_linkman">
        <id name="lkm_id">
            <generator class="native"></generator>
        </id>
        <property name="lkm_gender"></property>
        <property name="lkm_name"></property>
        <property name="lkm_phone"></property>
        <property name="lkm_mobile"></property>
        <property name="lkm_email"></property>
        <property name="lkm_qq"></property>
        <property name="lkm_position"></property>
        <property name="lkm_memo"></property>
        <!-- 多对一 -->
        <!-- 
            name属性:引用属性名 
            column属性: 外键列名 
            class属性: 与我关联的对象完整类名
         -->
         <!-- 
             级联操作:    cascade
                 save-update: 级联保存更新
                 delete:级联删除
                 all:save-update+delete
             级联操作: 简化操作.目的就是为了少些两行代码.
          -->
          <!-- 多的一方: 不能放弃维护关系的.外键字段就在多的一方.  -->
        <many-to-one name="customer" column="lkm_cust_id" class="Customer">
        </many-to-one>

    </class>
</hibernate-mapping>

多对多

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="www.test.domain">
    <class name="Role" table="sys_role">
        <id name="role_id" column="role_id">
            <generator class="native"></generator>
        </id>
        <property name="role_name"></property>
        <property name="role_memo"></property>
        <!-- 多对多关系表达 -->
        <!-- 
            name: 集合属性名
            table: 配置中间表名
            key
             |-column:外键,别人引用"我"的外键列名
             class: 我与哪个类是多对多关系
             column:外键.我引用别人的外键列名
         -->
         <!-- cascade级联操作:
                     save-update: 级联保存更新
                     delete:级联删除
                     all:级联保存更新+级联删除
             结论: cascade简化代码书写.该属性使不使用无所谓. 建议要用只用save-update.
                  如果使用delete操作太过危险.尤其在多对多中.不建议使用.
          -->
          <!-- 使用inverse属性
            true: 放弃维护外键关系
            false(默认值):维护关系
            
        结论: 将来在开发中,如果遇到多对多关系.一定要选择一方放弃维护关系.
             一般谁来放弃要看业务方向. 例如录入员工时,需要为员工指定所属角色.
             那么业务方向就是由员工维护角色. 角色不需要维护与员工关系.角色放弃维护
         -->    
          <set name="users" table="sys_user_role" inverse="true">
              <key column="role_id"></key>
              <many-to-many class="User" column="user_id"></many-to-many>
          </set>
    </class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="www.test.domain">
    <class name="User" table="sys_user">
        <id name="user_id" column="user_id">
            <generator class="native"></generator>
        </id>
        <property name="user_code"></property>
        <property name="user_name"></property>
        <property name="user_password"></property>
        <property name="user_state"></property>
        <!-- 多对多关系表达 -->
        <!-- 
            name: 集合属性名
            table: 配置中间表名
            key
             |-column:外键,别人引用"我"的外键列名
             class: 我与哪个类是多对多关系
             column:外键.我引用别人的外键列名
         -->
         <!-- cascade级联操作:
                     save-update: 级联保存更新
                     delete:级联删除
                     all:级联保存更新+级联删除
             结论: cascade简化代码书写.该属性使不使用无所谓. 建议要用只用save-update.
                  如果使用delete操作太过危险.尤其在多对多中.不建议使用.
          -->
          <set name="roles" table="sys_user_role" cascade="save-update">
              <key column="user_id"></key>
              <many-to-many class="Role" column="role_id"></many-to-many>
          </set>
    </class>
</hibernate-mapping>

加入类加载策略和关联级别加载策略

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 配置表与实体的关系 -->
<!-- package属性:填写一个包名。在元素内部凡是需要书写完整类名得属性,可以直接写简单类名就可以了 -->
<hibernate-mapping package="www.test.domain">
    <!--Class元素:配置实体与表得对应关系得
            name:完整类名
            table:数据库表名
      -->
    <class name="Customer" table="cst_customer" lazy="false">
    <!--id:配置主键映射得属性
            name:填写主键对应得属性名
            column:填写表中得主键得列名   默认值:列名会默认使用属性名
            type:填写列(属性)得类型。hibernate会自动检测实体的属性类型
                 每个类型有三种写法:分别是java类型 | hibernate类型 | 数据库类型
                java类型:             
                <property name="cust_name" column="cust_name" type="java.lang.String"></property>
                hibernate类型:
                <property name="cust_name" column="cust_name" type="string"></property>
                数据库类型:
                <property name="cust_name" column="cust_name" >
                    <column name="cust_name" sql-type="varchar"></column>
                </property>
            
                注意:不建议指定,自动检测实体属性类型就可以。
            
            not-null(可选):配置该属性(列)是否不能为空,默认值false默认可以为空
                <property name="cust_name" column="cust_name" not-null="true"></property>
            
            length(可选):配置数据库中列的长度。 默认值:使用数据库类型的最大长度 varchar默认最大长度255。
      -->
        <id name="cust_id" column="cust_id" >
        <!-- generator:主键生成得策略(后面讲) -->
            <generator class="native"></generator>
        </id>
        
        <!-- property:配置除了id之外得普通属性映射
                    name:填写属性名
                    column(可选):填写属性对应得列名 默认值:列名会默认使用属性名
                    type:填写列(属性)得类型。hibernate会自动检测实体的属性类型
                         每个类型有三种写法:分别是java类型 | hibernate类型 | 数据库类型
                        java类型:             
                        <property name="cust_name" column="cust_name" type="java.lang.String"></property>
                        hibernate类型:
                        <property name="cust_name" column="cust_name" type="string"></property>
                        数据库类型:
                        <property name="cust_name" column="cust_name" >
                            <column name="cust_name" sql-type="varchar"></column>
                        </property>
                    
                        注意:不建议指定,自动检测实体属性类型就可以。
                    
                    not-null(可选):配置该属性(列)是否不能为空,默认值false默认可以为空
                        <property name="cust_name" column="cust_name" not-null="true"></property>
                    
                    length(可选):配置数据库中列的长度。 默认值:使用数据库类型的最大长度 varchar默认最大长度255。
                         
         -->
        <property name="cust_name" column="cust_name"></property>
        <property name="cust_source" column="cust_source"></property>
        <property name="cust_industry" column="cust_industry"></property>
        <property name="cust_level" column="cust_level"></property>
        <property name="cust_linkman" column="cust_linkman"></property>
        <property name="cust_phone" column="cust_phone"></property>
        <property name="cust_mobile" column="cust_mobile"></property>
        <!-- 集合,一对多关系,在配置文件中配置 -->
        <!-- 
            name属性:集合属性名
            column属性: 外键列名
            class属性: 与我关联的对象完整类名
         -->
          <!-- 
             级联操作:    cascade
                 save-update: 级联保存更新
                 delete:级联删除
                 all:save-update+delete
             级联操作: 简化操作.目的就是为了少写两行代码.
          -->
          <!-- inverse属性: 配置关系是否维护. 
                  true: customer不维护关系
                  false(默认值): customer维护关系
                  
              inverse属性: 性能优化.提高关系维护的性能.
              原则: 无论怎么放弃,总有一方必须要维护关系.
              一对多关系中: 一的一方放弃.也只能一的一方放弃.多的一方不能放弃.
          -->
          <!-- 
        lazy属性: 决定是否延迟加载
            true(默认值): 延迟加载,懒加载
            false: 立即加载
            extra: 极其懒惰
        fetch属性: 决定加载策略.使用什么类型的sql语句加载集合数据
            select(默认值): 单表查询加载
            join: 使用多表查询加载集合
            subselect:使用子查询加载集合
     -->
     <!-- batch-size: 抓取集合的数量为3.
             抓取客户的集合时,一次抓取几个客户的联系人集合.
      -->
         <set name="linkMans" inverse="true" batch-size="3">
             <key column="lkm_cust_id"></key>
             <one-to-many class="LinkMan"/>
         </set>
    </class>
</hibernate-mapping>

2 hibernate主配置文件 hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 
        #hibernate.dialect org.hibernate.dialect.MySQLDialect
        #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
        #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
        #hibernate.connection.driver_class com.mysql.jdbc.Driver
        #hibernate.connection.url jdbc:mysql:///test
        #hibernate.connection.username gavin
        #hibernate.connection.password 
        -->
        <!-- 数据库驱动 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 数据库的url -->
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property> <!-- /// 表示连接本机 -->
        <!-- 数据库连接的用户名 -->
        <property name="hibernate.connection.username">root</property>
        <!-- 数据库连接密码 -->
        <property name="hibernate.connection.password">root</property>
        <!-- 数据库方言
            不同的数据库中,sql语法略有区别,指定方言可以让hibernate框架生成sql语句时。针对数据库方言生成。
            sql99标准:DDL 定义语言       库表的增删改查
                       DML 控制语言      事务权限
                       DCL 操作语言       针对增删改查
                        注意事项:MySQL在选择方言时候,请选择最短的方言。
                                 org.hibernate.dialect.MySQLDialect
                       
                        
         -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLMyISAMDialect</property>
        
        <!-- 
        #hibernate.show_sql true  //打印生成的sql
        #hibernate.format_sql true  //格式化sql  如果不格式都会在一行
         -->
         <!--将hibernate生成的sql语言打印到控制台  -->
        <property name="hibernate.show_sql">true</property>
         <!--将hibernate生成的sql语句格式化(语法缩进)  -->
        <property name="hibernate.format_sql">true</property>
        
        <!-- 
        ## auto schema export 自动导出表结构 。  自动建表

        #hibernate.hbm2ddl.auto create-drop  自动建表。每次框架运行结束都会将所有的表删除。(开发环境中测试使用)
        #hibernate.hbm2ddl.auto create 自动建表。每次框架的运行都会自动创建新的表。以前表将会被覆盖,表数据会丢失,(开发环境中测试使用)
        #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表。如果已经存在不会再生成。如果表有变动。自动更新表(不会删除任何数据)
        #hibernate.hbm2ddl.auto validate 校验。不自动生成表。每次启动会校验数据库中表是否正确。校验失败
         -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        
        <!-- 引入orm元数据
            路径书写:填写src下的路径
         -->
        <mapping resource="www/test/domain/Customer.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

3 hibernate.cfg.xml(版本二)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
         <session-factory>
                    <!--五个基本配置
                    ## MySQL
                
                    #hibernate.dialect org.hibernate.dialect.MySQLDialect
                    #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
                    #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
                    #hibernate.connection.driver_class com.mysql.jdbc.Driver
                    #hibernate.connection.url jdbc:mysql:///test
                    #hibernate.connection.username gavin
                    #hibernate.connection.password
                      -->
              <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
              <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
              <property name="hibernate.connection.username">root</property>
              <property name="hibernate.connection.password">root</property>
              <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
                     <!--sql的2个可选配置
                     #hibernate.show_sql true
                     #hibernate.format_sql true
                       -->
               <property name="hibernate.show_sql">true</property>
               <property name="hibernate.format_sql">true</property>
               <!--表的策略可选配置
                       ## auto schema export

                    #hibernate.hbm2ddl.auto create-drop
                    #hibernate.hbm2ddl.auto create
                    #hibernate.hbm2ddl.auto update
                    #hibernate.hbm2ddl.auto validate
                 -->
                 <property name="hibernate.hbm2ddl.auto">update</property>
                 
                 <!-- 指定隔离级别
                 #hibernate.connection.isolation 4 -->
                 <property name="hibernate.connection.isolation">4</property>
                 
                 <!-- 指定session与当前线程绑定 -->
                 <property name="hibernate.current_session_context_class">thread</property>
                 
                 
                 <!-- 引入orm元数据 -->
                 <mapping resource="www/java/domain/Customer.hbm.xml"/>
               
         </session-factory>
</hibernate-configuration>
原文地址:https://www.cnblogs.com/jepson6669/p/8486651.html