maven 導(dǎo)入
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.2.Final</version>
</dependency>
Hibernate 主配置文件
配置文件主要配置三方面的信息
- 連接數(shù)據(jù)庫的基本信息:驅(qū)動(dòng)谒出、URL忧饭、用戶名逾滥、密碼
- Hibernate 框架特性
- 注冊映射文件徐勃,即指定映射文件的位置
對于<session-factory>
標(biāo)簽羡儿,可以包含多個(gè) <property>
元素礼患,用于配置 hibernate 與 DB 的連接信息及數(shù)據(jù)源信息;可以包含多個(gè) <mapping>
元素掠归,用于注冊多個(gè)映射文件缅叠。
<session-factory>
DB 的連接信息
Hibernate 特性
注冊映射文件
</session-factory>
數(shù)據(jù)庫連接設(shè)置
在數(shù)據(jù)庫連接四要素的 name 屬性名稱,cooection.* 與 hibernate.connection.* 的效果完全相同的虏冻,是為了兼容以前的版本
在數(shù)據(jù)庫連接的 url 屬性值的設(shè)置肤粱,一般寫法是
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"/>
方言設(shè)置
方言的試著信息可以從 Hibernate 核心 jar 文件 hibernate-core-5.0.1.Final.jar 中的 org.hibernate.dialect 包中找到相應(yīng)的類。賦值全類名即可為方言的值厨相。
自動(dòng)建表設(shè)置
- create: 每次加載主配置文件時(shí)都會刪除上一次的生成的表领曼,然后再生成新表,哪怕兩次表結(jié)構(gòu)沒有任何變化蛮穿。
- create-drop:每次加載主配置文件時(shí)會生成表庶骄,但是 sessionFactory 一旦關(guān)閉,表就自動(dòng)刪除践磅。
- update:當(dāng)表字段增加時(shí)单刁,會添加字段:當(dāng)表字段減少時(shí),不會減少字段府适。若表結(jié)構(gòu)沒有變化羔飞,但數(shù)據(jù)變化時(shí)肺樟,會修改數(shù)據(jù)。
數(shù)據(jù)庫連接池配置
Hibernate 5 默認(rèn)使用的是其自己開發(fā)的內(nèi)置連接池逻淌。該連接池只是讓調(diào)試代碼時(shí)使用么伯,在真正產(chǎn)品中不能使用】ㄈ澹可以從控制臺的 Hibernate 啟動(dòng)信息中查看到蹦狂。
工業(yè)生產(chǎn)中,常用的數(shù)據(jù)源有 DBCP朋贬、C3P0 等凯楔。
注冊映射文件
映射文件若存在多個(gè),則可寫多個(gè)<mapping>
映射文件詳解
配置映射文件锦募,即配置兩個(gè)關(guān)系:
- 實(shí)體類與數(shù)據(jù)庫中表的映射關(guān)系
- 屬性與表中字段的映射關(guān)系
<hibernate-mapping>
標(biāo)簽
該標(biāo)簽是 Hibernate 映射文件的根元素摆屯,其下可以包含多個(gè) <class>
標(biāo)簽。常用的屬性主要是 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>
標(biāo)簽
該標(biāo)簽用于設(shè)置 PO 類與數(shù)據(jù)表之間的映射關(guān)系
- name 屬性: 指定持久化類虐骑。若
<hibernate-mapping/>
標(biāo)簽設(shè)置了 package 屬性,那么赎线,此處的 name 只需是類名極客廷没;否則需要完整包名 - table 屬性:指定持久化類對應(yīng)的數(shù)據(jù)表名稱。若不指定垂寥,Hibernate 將默認(rèn)為表名與類名相同颠黎。
- catalog: 指定數(shù)據(jù)庫。默認(rèn)為配置文件中指定的 DB滞项。
<id>
與 <property>
標(biāo)簽
他們都是 <class>
標(biāo)簽的子標(biāo)簽狭归。用于指定 PO 類的 id 屬性與表的主鍵之間的映射關(guān)系,他們的屬性基本相同文判。常用的有:
- name 屬性:指定持久化類的屬性名
- column 屬性:指定數(shù)據(jù)表中與 name 屬性對應(yīng)的字段名过椎。若不指定,默認(rèn)為與 name 屬性同名戏仓。
- length 屬性:指定屬性所映射字段的長度疚宇,單位字節(jié)。
- not-null 屬性:為指定的字段添加非空約束赏殃。
- type 屬性:指定屬性所映射的字段的類型敷待。若省略 Hibernate 會自動(dòng)從持久化類中檢測到類型。這里的類型取值支持兩大類:Java 類型與 Hibernate 類型嗓奢。Java 類型值得是 Java 中代碼中的類型讼撒。若是基本數(shù)據(jù),如 int股耽、double 等根盒,直接寫即可。但若是對象類型物蝙,則需要寫上全類名炎滞,如 java.lang.String。
Hibernate 類型是指 Hibernate 中定義的類型诬乞。
- PO 中屬性類型為 boolean册赛,type 也可指定為 boolean,但數(shù)據(jù)庫中的類型為 bit(二進(jìn)制位)震嫉。0 代表 false森瘪,1 代表 true。
- PO 中屬性類型為 byte[]票堵,則這里的 type 應(yīng)指定為 binay
sql-type 屬性:當(dāng)然映射文件中最短類型還支持一種類型扼睬,即數(shù)據(jù)庫中數(shù)據(jù)類型。但這種類型的使用悴势,需要使用 <column>
元素窗宇,其中有一個(gè) sql-type 屬性用于指定字段類型。其值為所使用的 DBMS 的數(shù)據(jù)類型特纤。
Hibernate 常用內(nèi)置主鍵生成策略
increment 生成策略
該策略是 Hibernate 自己在維護(hù)主鍵的值军俊。當(dāng)準(zhǔn)備在數(shù)據(jù)庫表中插入一條新記錄時(shí),首先從數(shù)據(jù)庫表中獲取當(dāng)前主鍵的最大值捧存,然后在最大值基礎(chǔ)上加 1粪躬,作為新插入記錄的主鍵值,這就是 increament 生成策略昔穴。
勇氣生成的主鍵字段所對應(yīng)的屬性類型可以是 long短蜕、short、int 及其封裝類的類型傻咖。這種生成策略只有在沒有其他進(jìn)程向同一張表中插入數(shù)據(jù)時(shí)才能使用朋魔。在高并發(fā)下或集群下不能使用。
identiry 生成策略
該策略使用數(shù)據(jù)庫自身的增長來維護(hù)主鍵值卿操。如 mysql 使用 auto_increment 來維護(hù)警检。用其生成的逐漸字段所對應(yīng)的屬性類型可以使 long、short害淤、int 及其封裝類的類型扇雕。
該策略在生成主鍵值時(shí)會出現(xiàn)以下的情況:對于插入操作,即使最后的執(zhí)行是回滾窥摄,DB 中記錄主鍵值的變量也會增一因?yàn)槠涫褂玫氖?MySQL 自身的 auto_increment 來為 id 賦值镶奉。
sequence 生成策略
在 Oracle、DB2 和 PostgreSQL 等數(shù)據(jù)庫中創(chuàng)建一個(gè)序列(sequence),然后 Hibernate 通過該序列為當(dāng)前記錄獲取主鍵值哨苛,從而為實(shí)體對象賦予主鍵字段映射屬性值鸽凶。此 sequence 生成策略,用其生成的主鍵字段映射屬性的類型可以使 long建峭、hort玻侥、int 及其封裝的類的類型。
antive 生成策略
由 Hibernate 根據(jù)所使用的數(shù)據(jù)庫支持能力從 identity亿蒸、sequence 生成策略中選擇一種凑兰。
使用這種表示服屬性生成策略可以根據(jù)不同的數(shù)據(jù)庫采用不同的生成策略,如 Oracle 中使用 sequence边锁,在 MySQL 中使用 identity 便于 Hibernate 應(yīng)用在不同的數(shù)據(jù)庫之間移植姑食。
測試情況是,沒有生成任何與 id 生成有關(guān)的 SQL 語句茅坛。說明使用的是 identity 生成策略音半。
uuid 生成策略
uuid生成策略采用 UUID算法來生成一個(gè)字符串類型的主鍵值,該值使用 IP 地址灰蛙、JVM 的啟動(dòng)時(shí)間(精確到 1/4秒)祟剔、系統(tǒng)時(shí)間和一個(gè)計(jì)數(shù)器值(在當(dāng)前的 JVM中唯一)經(jīng)過計(jì)算 產(chǎn)生,可以用于分布式的 Hibernate 應(yīng)用中摩梧。產(chǎn)生的標(biāo)識符屬性是一個(gè) 32 位長度的字符串物延。 使用這種生成策略,要求屬性的類型必須為 String類型仅父。 這種標(biāo)識符屬性生成策略生成的數(shù)值可以保證多個(gè)數(shù)據(jù)庫之間的唯一性叛薯,并且由于其 生成與具體的數(shù)據(jù)庫沒有關(guān)系,所以其移植性較強(qiáng)笙纤。但由于該值是 32 位長的字符串耗溜,所以 占用的數(shù)據(jù)庫空間較大,并且檢索速度較慢省容。不過抖拴,實(shí)際開發(fā)中使用這種生成策略較多。 除了使用 Hibernate 外腥椒,在 JDBC 中也可以使用 uuid 生成主鍵阿宅。因?yàn)?UUID 是 java.util 包中的一個(gè)獨(dú)立的類×耄可以打開項(xiàng)目的 JRE System Library 庫中的 rt.jar洒放,在其中找到 java.util 包,即可看到 UUID這個(gè)類
所有生成策略如下顯示
<class name="com.draper.domain.User" table="user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>