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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容