Hibernate 主配置文件
maven 导入
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.2.Final</version>
</dependency>
Hibernate 主配置文件
配置文件主要配置三方面的信息
- 连接数据库的基本信息:驱动、URL、用户名、密码
- Hibernate 框架特性
- 注册映射文件,即指定映射文件的位置
对于<session-factory>
标签,可以包含多个 <property>
元素,用于配置 hibernate 与 DB 的连接信息及数据源信息;可以包含多个 <mapping>
元素,用于注册多个映射文件。
<session-factory>
DB 的连接信息
Hibernate 特性
注册映射文件
</session-factory>
数据库连接设置
在数据库连接四要素的 name 属性名称,cooection.* 与 hibernate.connection.* 的效果完全相同的,是为了兼容以前的版本
在数据库连接的 url 属性值的设置,一般写法是
jdbc:mysql://localhost:3306/database_name
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/hibernatelearning"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
方言设置
方言的试着信息可以从 Hibernate 核心 jar 文件 hibernate-core-5.0.1.Final.jar 中的 org.hibernate.dialect 包中找到相应的类。赋值全类名即可为方言的值。
自动建表设置
- create: 每次加载主配置文件时都会删除上一次的生成的表,然后再生成新表,哪怕两次表结构没有任何变化。
- create-drop:每次加载主配置文件时会生成表,但是 sessionFactory 一旦关闭,表就自动删除。
- update:当表字段增加时,会添加字段:当表字段减少时,不会减少字段。若表结构没有变化,但数据变化时,会修改数据。
数据库连接池配置
Hibernate 5 默认使用的是其自己开发的内置连接池。该连接池只是让调试代码时使用,在真正产品中不能使用。可以从控制台的 Hibernate 启动信息中查看到。
工业生产中,常用的数据源有 DBCP、C3P0 等。
注册映射文件
映射文件若存在多个,则可写多个<mapping>
映射文件详解
配置映射文件,即配置两个关系:
- 实体类与数据库中表的映射关系
- 属性与表中字段的映射关系
<hibernate-mapping>
标签
该标签是 Hibernate 映射文件的根元素,其下可以包含多个 <class>
标签。常用的属性主要是 package 属性,用于指定其所包含的 <class>
类所在的包
例如
<hibernate-mapping>
<class name="com.draper.domain.User" table="huser">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
<class>
标签
该标签用于设置 PO 类与数据表之间的映射关系
- name 属性: 指定持久化类。若
<hibernate-mapping/>
标签设置了 package 属性,那么,此处的 name 只需是类名极客;否则需要完整包名 - table 属性:指定持久化类对应的数据表名称。若不指定,Hibernate 将默认为表名与类名相同。
- catalog: 指定数据库。默认为配置文件中指定的 DB。
<id>
与 <property>
标签
他们都是 <class>
标签的子标签。用于指定 PO 类的 id 属性与表的主键之间的映射关系,他们的属性基本相同。常用的有:
- name 属性:指定持久化类的属性名
- column 属性:指定数据表中与 name 属性对应的字段名。若不指定,默认为与 name 属性同名。
- length 属性:指定属性所映射字段的长度,单位字节。
- not-null 属性:为指定的字段添加非空约束。
- type 属性:指定属性所映射的字段的类型。若省略 Hibernate 会自动从持久化类中检测到类型。这里的类型取值支持两大类:Java 类型与 Hibernate 类型。Java 类型值得是 Java 中代码中的类型。若是基本数据,如 int、double 等,直接写即可。但若是对象类型,则需要写上全类名,如 java.lang.String。
Hibernate 类型是指 Hibernate 中定义的类型。
- PO 中属性类型为 boolean,type 也可指定为 boolean,但数据库中的类型为 bit(二进制位)。0 代表 false,1 代表 true。
- PO 中属性类型为 byte[],则这里的 type 应指定为 binay
sql-type 属性:当然映射文件中最短类型还支持一种类型,即数据库中数据类型。但这种类型的使用,需要使用 <column>
元素,其中有一个 sql-type 属性用于指定字段类型。其值为所使用的 DBMS 的数据类型。
Hibernate 常用内置主键生成策略
increment 生成策略
该策略是 Hibernate 自己在维护主键的值。当准备在数据库表中插入一条新记录时,首先从数据库表中获取当前主键的最大值,然后在最大值基础上加 1,作为新插入记录的主键值,这就是 increament 生成策略。
勇气生成的主键字段所对应的属性类型可以是 long、short、int 及其封装类的类型。这种生成策略只有在没有其他进程向同一张表中插入数据时才能使用。在高并发下或集群下不能使用。
identiry 生成策略
该策略使用数据库自身的增长来维护主键值。如 mysql 使用 auto_increment 来维护。用其生成的逐渐字段所对应的属性类型可以使 long、short、int 及其封装类的类型。
该策略在生成主键值时会出现以下的情况:对于插入操作,即使最后的执行是回滚,DB 中记录主键值的变量也会增一因为其使用的是 MySQL 自身的 auto_increment 来为 id 赋值。
sequence 生成策略
在 Oracle、DB2 和 PostgreSQL 等数据库中创建一个序列(sequence),然后 Hibernate 通过该序列为当前记录获取主键值,从而为实体对象赋予主键字段映射属性值。此 sequence 生成策略,用其生成的主键字段映射属性的类型可以使 long、hort、int 及其封装的类的类型。
antive 生成策略
由 Hibernate 根据所使用的数据库支持能力从 identity、sequence 生成策略中选择一种。
使用这种表示服属性生成策略可以根据不同的数据库采用不同的生成策略,如 Oracle 中使用 sequence,在 MySQL 中使用 identity 便于 Hibernate 应用在不同的数据库之间移植。
测试情况是,没有生成任何与 id 生成有关的 SQL 语句。说明使用的是 identity 生成策略。
uuid 生成策略
uuid生成策略采用 UUID算法来生成一个字符串类型的主键值,该值使用 IP 地址、JVM 的启动时间(精确到 1/4秒)、系统时间和一个计数器值(在当前的 JVM中唯一)经过计算 产生,可以用于分布式的 Hibernate 应用中。产生的标识符属性是一个 32 位长度的字符串。 使用这种生成策略,要求属性的类型必须为 String类型。 这种标识符属性生成策略生成的数值可以保证多个数据库之间的唯一性,并且由于其 生成与具体的数据库没有关系,所以其移植性较强。但由于该值是 32 位长的字符串,所以 占用的数据库空间较大,并且检索速度较慢。不过,实际开发中使用这种生成策略较多。 除了使用 Hibernate 外,在 JDBC 中也可以使用 uuid 生成主键。因为 UUID 是 java.util 包中的一个独立的类。可以打开项目的 JRE System Library 库中的 rt.jar,在其中找到 java.util 包,即可看到 UUID这个类
所有生成策略如下显示
<class name="com.draper.domain.User" table="user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>