“Hibernate笔记 2:配置文件详解”的版本间差异
跳到导航
跳到搜索
第221行: | 第221行: | ||
=== 配置:Session 管理方式 === | === 配置:Session 管理方式 === | ||
用于追踪 Session,以实现“在我们定义的上下文环境中调用 getCurrentSession 方法获得的总是同一个 session”。 | |||
配置: | 配置: | ||
: <syntaxhighlight lang="xml" highlight=""> | : <syntaxhighlight lang="xml" highlight=""> | ||
第227行: | 第229行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
: 可选值: | : 可选值: | ||
:* <span style="color: blue">'''thread'''</span>:Session | :* <span style="color: blue">'''thread'''</span>:Session 对象的生命周期与本地线程绑定;【使用“'''本地事务'''”(JDBC 事务)】 | ||
:* <span style="color: blue">jta</span>:Session 对象的生命周期与 JTA | :* <span style="color: blue">jta</span>:Session 对象的生命周期与 JTA 事务绑定;【使用“'''全局事务'''”(JTA 事务)】 | ||
:* <span style="color: blue">managed</span>:由 Hibernate 托管程序来管理 Session | :* <span style="color: blue">managed</span>:由 Hibernate 托管程序来管理 Session 对象的生命周期。【不常用】 | ||
'''全局事务''':资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用 XA 二阶段提交协议与“企业信息系统”(EIS)或数据库进行交互。 | '''全局事务''':资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用 XA 二阶段提交协议与“企业信息系统”(EIS)或数据库进行交互。 | ||
'''本地事务''':在单个 EIS 或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。 | '''本地事务''':在单个 EIS 或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。 |
2022年6月10日 (五) 17:19的版本
关于
配置文件是 Hibernate 中相当重要的部分,对于 Hibernate、数据库、orm 等内容的都依赖于配置文件。 1、配置文件可以是: .xml文件、.properties文件(属性文件); 2、配置文件中均需要引入 dtd 约束; - (xml 的约束格式包括:dtd、schema,而 Hibernate 的配置文件中均使用 dtd)
“映射关系”配置文件
“映射关系”,即:实体类和数据库表一一对应的关系。 关于“映射关系配置文件”: 1、文件名称 和 位置 没有固定要求; - 建议:在实体类所在包里面创建,名称为“<实体类名称>.hbm.xml”;
格式
<?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> <!-- class 标签:建立“类”和“表”的映射 * name 属性 :类中的全路径 * table 属性 :表名(如果类名和表名一致,则该属性可以省略) * catalog 属性:数据库名称,可以省略 --> <class name="XXX.XXX.XXX" table="ZZZ"> <!-- id 标签:建立“类中的唯一性属性”与“表中的主键”的映射 * name 属性 :类中的属性名 * column 属性:表中的字段名(如果“类的属性名”和“表中的字段名”一致,则可省略) * length 属性:字段的长度 * type 属性:类型。写Java数据类型,Hibernate数据类型(默认),SQL类型 --> <id name="xxx" column="zzz"> <!-- 主键生成策略 --> <generator class="???"/> </id> <!-- id 标签: 建立“类中的普通属性”与“表中的字段”的映射 * name 属性 :类中的属性名 * column 属性:表中的字段名(如果“类的属性名”和“表中的字段名”一致,则可省略) * length 属性:字段的长度 * type 属性:类型。写Java数据类型,Hibernate数据类型(默认),SQL类型 --> <property name="xxx" column="zzz" type="???"/> <property name="xxx" column="zzz" type="???"/> <property name="xxx" column="zzz"/> <property name="xxx" column="zzz"/> </class> </hibernate-mapping>
<class>
用于配置“实体类”与“表”的对应;- “name”属性值为“实体类的全路径”;
<id>
用于配置“(具有唯一性的)实体类的属性”与“(具有唯一性的)表的字段”的对应;- “column”属性可以省略(与“name”一致);
<generator>
用于配置主键的“增长方式”;- uuid;
- native(自增);
<property>
用于配置“实体类的属性”与“表的字段”的对应;- “column”属性可以省略(与“name”一致);
- “type”属性用于设置生成表字段的类型(自动对应类型);
示例
- “Customer.hbm.xml”:
<?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> <class name="cn.itcast.domain.Customer" table="customer"> <id name="cust_id" column="id"> <generator class="native"/> </id> <property name="cust_name" column="name"/> <property name="cust_source" column="source"/> <property name="cust_industry" column="industry"/> <property name= "cust_level" column= "level"/> <property name="cust_phone" column="phone"/> <property name="cust_mobile" column="mobile"/> </class> </hibernate-mapping>
核心配置文件
Hibernate 核心配置文件,其名称与位置均是固定的。 关于“Hibernate 核心配置文件”: 1、文件名称和位置固定: - 位置:必须位于 src 下。 - 名称:必须为“hibernate.cfg.xml”(或“hibernate.properties”)。 2、hibernate 操作过程中,只会加载核心配置文件,其他配置文件不会加载。 - “映射关系配置文件”需要配置到“核心配置文件”中,才会被加载。
格式
<?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信息 --> ... <!-- 第三部分 映射文件 --> <mapping resource="..."/> <session-factory> </hibernate-configuration>
- 配置数据库信息:
- 使用不同的数据库驱动(不同版本驱动)时,配置信息可能有差别。【可以从类似“mysql-connector”的包里去找相应内容】
- 示例:
- 使用“mysql-connector-java-5.0.4-bin.jar”时:
<property name="hibernate.connection.driver.class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">admin</property>
- 使用“mysql-connector-java-8.0.11.jar”时:
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day02?useSSL=false&serverTimezone=UTC</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">admin</property>
- 配置 Hibernate 信息:
<!-- 控制台输出 sql 语句 --> <property name="hibernate.show_sql">true</property> <!-- 格式化输出的 sql 语句 --> <property name="hibernate.format_sql">true</property> <!-- hibernate 的 DDL 规则(update:无则创建,有则更新) --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 配置数据库方言(让 hibernate 框架识别不同数据库特有的方言) --> <property name="hibernate.dialect">org.hibernate.dialect.MySqlDialect</property>
- 配置“映射关系配置文件”:
- 需要定位到(需要加载的)“映射关系配置文件”所在包的位置。
- 示例:
<mapping resource = "cn/itcast/entity/User.hbm.xml"/>
常用配置
名称 用途 hibernate.dialect 操作数据库方言 hibernate.connection.driver_class 连接数据库驱动程序 hibernate.connection.url 连接数据库 URL hibernate.connection.username 数据库用户名 hibernate.connection.password 数据库密码 hibernate.show_sql 在控制台上输出 SQL 语句 hibernate.format_sql 格式化控制台输出的 SQL 语句 hibernate.hbm2ddl.auto 当 SessionFactory 创建时是否根据映射文件自动验证表结构或自动创建、自动更新数据库表结构。 - 该参数的取值为: none、 validate、 update、 create 和 create-drop。
hibernate.connection.autocommit 事务是否自动提交
- hibernate.hbm2ddl.auto 的取值:(DDL,即“数据库定义语言”,如:create drop alter 等)
- none:不用 Hibernate 自动生成表;
- create:每次都会创建新的表;【用于测试】
- create-drop:每次都会创建新的表,执行程序结束后删除表;【用于测试】
- update:如果数据库中有表则直接使用,否则创建新表,且可以更新表结构;
- validate:只会使用原有的表,对映射关系进行校验;
配置:连接池
SessionFactory 内部还维护了一个连接池,如果需要使用第三方连接池(如:C3PO),则需要手动进行配置。
步骤:
- 引入 C3PO 相关 JAR 包:
- c3p0-0.9.2.1.jar
- hibernate-c3p0-5.0.7.Final.jar
- mchange-commons-java-0.2.3.4.jar
- 配置 C3PO 连接池(hibernate.cfg.xml 中):
<!-- 配置C3PO连接池 --> <property name= "connection.provider_c1ass">org.hibernate.connection.C3POConnectionProvider</property> <!-- 连接池中可用数据库连接的最少数目 --> <property name= "c3p0.min_size">5</property> <!-- 连接池中所有数据库连接的最大数目 --> <property name= "c3p0.max_size">20</property> <!-- 数据库连接的过期时间(单位:秒): 如果池中某个连接处于空闲状态的时间超过了 timeout 时间,就会从连接池中消除 --> <property name= "c3p0.timeout">120</property> <!-- 检查连接池中的空闲连接的时间间隔(单位:秒)--> <property name= "c3p0.idle_test_period ">3000</property>
配置:Session 管理方式
用于追踪 Session,以实现“在我们定义的上下文环境中调用 getCurrentSession 方法获得的总是同一个 session”。
配置:
<!-- 配置 Session 管理方式 --> <property name="current_session_context_class">thread</property>
- 可选值:
- thread:Session 对象的生命周期与本地线程绑定;【使用“本地事务”(JDBC 事务)】
- jta:Session 对象的生命周期与 JTA 事务绑定;【使用“全局事务”(JTA 事务)】
- managed:由 Hibernate 托管程序来管理 Session 对象的生命周期。【不常用】
全局事务:资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用 XA 二阶段提交协议与“企业信息系统”(EIS)或数据库进行交互。 本地事务:在单个 EIS 或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。