前言
本章讲解Hibernate的配置文件
方法
1.概念
在前面的学习中,我们提到了两个在Hibernate中非常重要的配置文件,即hibernate.cfg.xml和XXX.hbm.xml
那么,本章将围绕这两个配置文件进行讲解!
2.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>
<!-- 数据库连接配置 -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<!-- 数据库方言,指定使用的数据库 -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- 显示SQL -->
<property name="show_sql">true</property>
<!-- 配置映射文件路径 -->
<mapping resource="cn/edu/ccut/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
这里列举的不是太全面,下面将进行一一讲解:
1)数据库连接配置:
在这里,有必须要配置的几个参数,那就是我们之前学习JDBC以及MyBatis所必须的四个配置,这里就不多说了:
<!-- 数据库连接配置 -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
还有一些其他的附加配置,如果使用c3p0等连接池的时候:
<property name="connection.pool_size">100</property>//连接池大小
<property name="connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>//c3p0连接池
<property name="c3p0.acquire_increment">5</property>//
<propertyname="c3p0.idle_test_period">60</property>//设定的时间间隔去自动校验链接对象并销毁timeout的
<property name="c3p0.max_size">100</property>//最大连接数
<property name="c3p0.min_size">15</property>//最小连接数
<property name="c3p0.max_statements">100</property>//JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个 connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。如果maxStatements与 maxStatementsPerConnection均为0,则缓存被关闭
<property name="c3p0.timeout">1000</property>//连接超时时间
2)通用配置
通用配置包含数据库方言,SQL显示与版式,表的生成策略以及是否自动提交事务等等
<!-- show_sql: 操作数据库时,会 向控制台打印sql语句 -->
<property name="show_sql">true</property>
<!-- format_sql: 打印sql语句前,会将sql语句先格式化 -->
<property name="format_sql">true</property>
<!-- update(最常用的取值): 如果当前数据库中不存在表结构,那么自动创建表结构.
如果存在表结构,并且表结构与实体一致,那么不做修改
如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列.
create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失)
create-drop(极少): 无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构.
validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构. 如果表结构不一致将会抛出异常.
-->
<property name="hbm2ddl.auto">update</property>
<!-- 数据库方言配置 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- hibernate.connection.autocommit: 事务自动提交 -->
<property name="hibernate.connection.autocommit">true</property>
<!-- 将Session与线程绑定=> 只有配置了该配置,才能使用getCurrentSession -->
<property name="hibernate.current_session_context_class">thread</property>
3)映射文件配置
我们知道,每个实体类我们都配置了与之对应的XXX.hbm.xml
那么要想让Hibernate知道这些文件,必须配置加载:
<!-- 配置映射文件路径 -->
<mapping resource="cn/edu/ccut/User.hbm.xml"/>
特别的:可以有多个类似的映射文件路径配置
3.XXX.hbm.xml
该配置文件用来指示实体类与表之间的映射关系,一般情况下的命名方式是实体类名称.hbm.xml
如我的实体类是User.java,那么我的映射配置文件就是User.hbm.xml
先来看一下我们之前配置的User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 配置hibernate实体类与表的映射关系 package表示映射类所在的包名 -->
<hibernate-mapping package="cn.edu.ccut.bo">
<!-- 配置实体类和表的关系,包含实体类名称和表名称、实体类属性和表字段等等映射关系 -->
<class name="User" table="Users">
<!-- 主键及其生成策略 -->
<id name="username">
<generator class="native"></generator>
</id>
<!-- 其他属性配置 -->
<property name="password"></property>
</class>
</hibernate-mapping>
当然,这也只是最为简单的配置,我们只需要了解一些简单的配置即可,因为后期我们将使用注解进行配置!
一些基础的配置我相信大家看应该是可以看得懂的,这里主要讲解一下难点!
1)主键生成策略
主键生成策略有一大堆,这里我并不打算全部的说明!
这里主要讲解实际项目中常用的生成策略:
1.sequence
如果你的数据库如Oracle支持序列的话,那么你的主键可以选择此种生成方式,具体配置如下:
<!-- 主键及其生成策略 -->
<id name="username">
<generator class="sequence">
<!-- 配置所需要的序列名称,序列由数据库本身进行维护 -->
<param name="sequence">hibernate_id</param>
</generator>
</id>
2.identity
如果你的数据库如MySQL支持主键自增长的话,那么你的主键可以选择此种生成方式,具体配置如下:
<!-- 主键及其生成策略 -->
<id name="username">
<generator class="identity" />
</id>
3.native
该配置表示由hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式
<!-- 主键及其生成策略 -->
<id name="username">
<generator class="native"></generator>
</id>
4.uuid(公司开发中基本使用该主键生成策略)
该生成策略表示主键在保存对象的时候自动生成不会重复的32位机器码,使用十分方便!
具体配置如下:
<!-- 主键及其生成策略 -->
<id name="username">
<generator class="uuid"></generator>
</id>