hibernate--5.Hibernate配置文件详解

来源:互联网 发布:手机按键功能测试软件 编辑:程序博客网 时间:2024/05/18 16:56

五、Hibernate配置文件详解

 

1. hibernate.cfg.xml

 

Hibernate配置文件可以有两种格式:

         hibernate.properties,hibernate.cfg.xml

 

(1) JDBC 连接属性

 

1>导入jar包

在hibernate-release-4.2.4.Final\lib\required文件夹下:

 

 

2>加入配置项

 

connection.url:数据库URL

connection.username:数据库用户名

connection.password:数据库用户密码

connection.driver_class:数据库JDBC驱动

dialect:配置数据库的方言,根据底层的数据库不同产生不同的 sql 语句,Hibernate 会针对数据库的特性在访问时进行优化

 

(2)C3P0 数据库连接池属性

1>导入jar包:

hibernate-release-4.2.4.Final\lib\optional\c3p0

 

  

2>加入配置项

 

hibernate.c3p0.max_size: 数据库连接池的最大连接数

hibernate.c3p0.min_size: 数据库连接池的最小连接数

hibernate.c3p0.acquire_increment: 当数据库连接池中的连接耗尽时, 同一时刻获取多少个数据库连接

 

 

hibernate.c3p0.timeout:   数据库连接池中连接对象在多长时间没有使用过后,就应该被销毁

hibernate.c3p0.idle_test_period:  表示连接池检测线程多长时间检测一次池内的所有链接对象是否超时. 连接池本身不会把自己从连接池中移除,而是专门有一个线程按照一定的时间间隔来做这件事,这个线程通过比较连接对象最后一次被使用时间和当前时间的时间差来和 timeout 做对比,进而决定是否销毁这个连接对象。

 

hibernate.c3p0.max_statements:  缓存 Statement 对象的数量

 

在hibernate.cfg.xml中:

 

<!-- 配置 C3P0数据源 -->

        <propertyname="hibernate.c3p0.max_size">10</property>

        <propertyname="hibernate.c3p0.min_size">5</property>

        <propertyname="c3p0.acquire_increment">2</property>

       

        <propertyname="c3p0.idle_test_period">2000</property>

        <propertyname="c3p0.timeout">2000</property>

       

        <propertyname="c3p0.max_statements">10</property>

 

 

 

 

 

(3)其他常用

 

show_sql:            是否将运行期生成的SQL输出到日志以供调试。取值true | false

format_sql:           是否将 SQL 转化为格式良好的 SQL. 取值 true | false

hbm2ddl.auto:      在启动和停止时自动地创建,更新或删除数据库模式。取值 create |  update| create-drop | validate

hibernate.jdbc.fetch_size

                                     实质是调用Statement.setFetchSize() 方法设定 JDBC 的 Statement 读取 数据的时候每次从数据库中取出的记录条数

hibernate.jdbc.batch_size

                                     设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,类似于设置缓冲区大小的意思。

batchSize越大,批量操作时向数据库发送sql的次数越少,速度就越快。


 

参考手册,可选配置项:

hibernate-release-4.2.4.Final\documentation\manual\en-US\html_single\index.html


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连接数据库的基本信息 -->    <property name="connection.username">root</property>    <property name="connection.password">root</property>    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>    <property name="connection.url">jdbc:mysql:///hibernate1</property>        <!-- hibernate的基本配置 -->        <!-- hibernate使用的方言 -->    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>        <!-- 运行时是否打印sql -->    <property name="show_sql">true</property>        <!-- 运行时是否格式化sql -->    <property name="format_sql">true</property>        <!-- 生成数据表的策略 -->    <property name="hbm2ddl.auto">update</property><!-- 设置事务的隔离级别 --><property name="connection.isolation">2</property>    <!-- 删除对象后,使其OID置为null -->    <property name="use_identifier_rollback">true</property>        <!-- 配置 C3P0 数据源 -->    <property name="hibernate.c3p0.max_size">10</property>    <property name="hibernate.c3p0.min_size">5</property>    <property name="c3p0.acquire_increment">2</property>        <property name="c3p0.idle_test_period">2000</property>    <property name="c3p0.timeout">2000</property>        <property name="c3p0.max_statements">10</property>        <!--   关联的 hibernate 映射文件。hbm.xml -->    <mapping resource="hibernate/entities/News.hbm.xml"/>                </session-factory></hibernate-configuration>

2.对象关系映射文件*.hbm.xml

hibernate-mapping

类层次:class

主键:id

基本类型:property

实体引用类:many-to-one  |  one-to-one

集合:set | list | map |array

one-to-many

many-to-many

子类:subclass | joined-subclass

其它:component | any 等

查询语句:query(用来放置查询语句,便于对数据库查询的统一管理和优化)

每个Hibernate-mapping中可以同时定义多个类. 但更推荐为每个类都创建一个单独的映射文件

 

(1)hibernate-mapping--hibernate 映射文件的根元素

 


(2)class--指定类和表的映射

 


(3)OID--映射对象标识符

 

1>id:设定持久化类的 OID 和表的主键的映射

 

2>generator:设定持久化类设定标识符生成器

 


increment 标识符生成器

increment 标识符生成器由Hibernate 以递增的方式为代理主键赋值

 Hibernate 会先读取 NEWS 表中的主键的最大值, 而接下来向 NEWS 表中插入记录时, 就在 max(id) 的基础上递增, 增量为 1.

  适用范围:

  由于 increment 生存标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统

适用于只有单个 Hibernate 应用进程访问同一个数据库的场合, 在集群环境下不推荐使用它

OID 必须为 long, int或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常

 

identity 标识符生成器

identity 标识符生成器由底层数据库来负责生成标识符, 它要求底层数据库把主键定义为自动增长字段类型

适用范围:

由于 identity 生成标识符的机制依赖于底层数据库系统, 因此, 要求底层数据库系统必须支持自动增长字段类型. 支持自动增长字段类型的数据库包括: DB2, Mysql, MSSQLServer, Sybase 等

ID 必须为 long, int或 short 类型, 如果把OID 定义为 byte 类型, 在运行时会抛出异常

 

sequence 标识符生成器

 sequence  标识符生成器利用底层数据库提供的序列来生成标识符.

Hibernate 在持久化一个 News 对象时, 先从底层数据库的news_seq 序列中获得一个唯一的标识号, 再把它作为主键值

适用范围:

由于 sequence 生成标识符的机制依赖于底层数据库系统的序列, 因此, 要求底层数据库系统必须支持序列. 支持序列的数据库包括: DB2, Oracle 等

OID 必须为 long, int或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常

 

hilo 标识符生成器

hilo 标识符生成器由 Hibernate 按照一种 high/low 算法*生成标识符, 它从数据库的特定表的字段中获取 high 值.

 Hibernate 在持久化一个 News 对象时, 由 Hibernate 负责生成主键值.hilo 标识符生成器在生成标识符时, 需要读取并修改 HI_TABLE 表中的 NEXT_VALUE 值.

适用范围:

由于 hilo 生存标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统

 OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常

 

native 标识符生成器

native 标识符生成器依据底层数据库对自动生成标识符的支持能力, 来选择使用 identity, sequence 或 hilo 标识符生成器.

适用范围:

 由于 native 能根据底层数据库系统的类型,自动选择合适的标识符生成器, 因此很适合于跨数据库平台开发

OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常

 

(4) property --指定类的属性和表的字段的映射

 

 

派生属性:

    并不是持久化类的所有属性都直接和表的字段匹配, 持久化类的有些属性的值必须在运行时通过计算才能得出来, 这种属性称为派生属性

使用 formula 属性时:

formula=“(sql)”的英文括号不能少

Sql 表达式中的列名和表名都应该和数据库对应, 而不是和持久化对象的属性对应

如果需要在 formula 属性中使用参数, 这直接使用 where cur.id=id 形式, 其中 id 就是参数, 和当前持久化对象的 id 属性对应的列的 id 值将作为参数传入. 

 <!-- 映射派生属性 -->        <property name="desc" formula="(SELECT concat(author, ': ', title) FROM NEWS n WHERE n.id = id)"></property>

示例代码:News.hbm.xml

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="hibernate.entities">    <class name="News" table="NEWS" dynamic-update="true">            <id name="id" type="java.lang.Integer">            <column name="ID" />            <generator class="native" />        </id>                <property name="title" type="string" column="TITLE"        unique="true" update="false" index="news_index" length="20">        </property>                <property name="author" type="java.lang.String" index="news_index">            <column name="AUTHOR" />        </property>                <property name="date" type="time">            <column name="DATE" />        </property>                <!-- 映射派生属性 -->        <property name="desc" formula="(SELECT concat(author, ': ', title) FROM NEWS n WHERE n.id = id)"></property>                <!-- 映射大对象 -->        <!-- 若希望精确映射 SQL 类型, 可以使用 sql-type 属性. -->        <property name="content">        <column name="CONTENT" sql-type="mediumtext"></column>        </property>                <property name="image">        <column name="IMAGE" sql-type="mediumblob"></column>        </property>            </class>    </hibernate-mapping>

3. Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系

 

 

(1) 时间和日期类型

 

 


(2)大对象类型


 

 

源代码文件:http://download.csdn.net/detail/qq_26553781/9729082

 

4. 映射组成关系

(1)域模型和关系数据模型

域模型: 由程序代码组成, 通过细化持久化类的的粒度可提高代码的可重用性, 简化编程


在没有数据冗余的情况下, 应该尽可能减少表的数目, 简化表之间的参照关系, 以便提高数据的访问速度

 

 

(2)持久化类的属性

         值(value)类型: 没有 OID, 不能被单独持久化, 生命周期依赖于所属的持久化类的对象的生命周期

         实体(entity)类型: 有 OID, 可以被单独持久化, 有独立的生命周期

Worker.hbm.xml:

 <!-- 映射组成关系 -->        <component name="pay" class="Pay">        <parent name="worker"/>        <!-- 指定组成关系的组件的属性 -->        <property name="monthlyPay" column="MONTHLY_PAY"></property>        <property name="yearPay" column="YEAR_PAY"></property>        <property name="vocationWithPay" column="VOCATION_WITH_PAY"></property>        </component>
源代码文件:http://download.csdn.net/detail/qq_26553781/9729371




0 0
原创粉丝点击