一.Hibernate 配置文件


主要用于配置数据库连接和 Hibernate 运行时所需的各种属性, 每个 Hibernate 配置文件对应一个 Configuration 对象



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



hibernate.properties



hibernate.cfg.xml 


二. hibernate.cfg.xml的常用属性


1.jdbc连接属性:


<!--数据库连接配置-->
        <property name="connection.url">jdbc:mysql://localhost:3306/user1</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
<!--数据库方言-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>



hibernate会话工厂连接mysql8 hibernate配置数据库连接的属性_hibernate 配置文件




2. C3P0 数据库连接属性


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


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


hibernate.c3p0.timeout:


hibernate.c3p0.max_statements:


hibernate.c3p0.idle_test_period:


hibernate.c3p0.acquire_increment:


接池属性




需要导入相关jar包


lib-->optional-->c3p0 




hibernate会话工厂连接mysql8 hibernate配置数据库连接的属性_hibernate 配置文件_02



<!-- 设置c3p0线程池 -->
        <property name="hibernate.c3p0.max_size">10</property>
        <property name="hibernate.c3p0.min_size">2</property>
        <property name="hibernate.c3p0.timeout">5</property>

根据自己需要自行设置

测试是否配置成功:


 

@Test
	public void test() {
		session.doWork(new Work() {
			@Override
			public void execute(Connection connection) throws SQLException {
				System.out.println(connection.getClass().getName());
			}
		});
	}


测试 结果


hibernate会话工厂连接mysql8 hibernate配置数据库连接的属性_hibernate_03


3.其他


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


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


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




上面三个在之前的内容中已经写过,重点讲下下面的:


1.hibernate.jdbc.fetch_size


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


    例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会 1 次性把1万条取出来的,而只会取出 fetchSize 条数,当结果集遍历完了这些记录以后,再去数据库取 fetchSize 条数据。因此大大节省了无谓的内存消耗。Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。Oracle数据库的JDBC驱动默认的Fetch Size = 10,是一个保守的设定,根据测试,当Fetch Size=50时,性能会提升1倍之多,当fetchSize=100,性能还能继续提升20%,Fetch Size继续增大,性能提升的就不显著了。并不是所有的数据库都支持Fetch Size特性,例如MySQL就不支持




------------------------------------------------------------------------------------------------------------------------------------------------------


2.hibernate.jdbc.batch_size


设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,类似于设置缓冲区大小的意思。batchSize 越大,批量操作时向数据库发送sql的次数越少,速度就越快。


    测试结果是当Batch Size=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch Size = 50的时候,删除仅仅需要5秒!Oracle数据库batchSize=30 的时候比较合适。


<property name="hibernate.jdbc.fetch_size">100</property>
        <property name="hibernate.jdbc.batch_size">30</property>


3.映射组成关系


建立域模型和关系数据模型有着不同的出发点:


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



hibernate会话工厂连接mysql8 hibernate配置数据库连接的属性_数据库_04



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


hibernate会话工厂连接mysql8 hibernate配置数据库连接的属性_hibernate 配置文件_05


Hibernate 把持久化类的属性分为两种: 
值(value)类型: 没有 OID, 不能被单独持久化, 生命周期依赖于所属的持久化类的对象的生命周期
实体(entity)类型: 有 OID, 可以被单独持久化, 有独立的生命周期
显然无法直接用 property 映射 pay 属性
Hibernate 使用 <component> 元素来映射组成关系, 该元素表名 pay 属性是 Worker 类一个组成部分, 在 Hibernate 中称之为组件



<hibernate-mapping package="com.eduask.chp.bean">
       <class name="Work" table="work" >
       <id name="id" column="id">
       <generator class="native"></generator>
       </id>
       <property name="name" column="name"></property>
       <property name="age" column="age"></property>
        <component name="pay" class="Pay">
       <property name="monthPay" column="monthPay"></property>
       <property name="yearPay" column="yearPay"></property>
       </component> 
       </class>
    </hibernate-mapping>