您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Hiebernate的基本配置和映射類型介紹”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
<!--標(biāo)準(zhǔn)的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的編碼方式--> <?xml version='1.0' encoding='gb2312'?> <!--表明解析本XML文件的DTD文檔位置,DTD是Document Type Definition 的縮寫,即文檔類型的定義,XML解析器使用DTD文檔來(lái)檢查XML文件的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在Hibernate3.1.3軟件包中的src/org/hibernate目錄中找到此文件--> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <!--聲明Hibernate配置文件的開(kāi)始--> <hibernate-configuration> <!--表明以下的配置是針對(duì)session-factory配置的,SessionFactory是Hibernate中的一個(gè)類,這個(gè)類主要負(fù)責(zé)保存HIbernate的配置信息,以及對(duì)Session的操作--> <session-factory> <!--配置數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序,Hibernate在連接數(shù)據(jù)庫(kù)時(shí),需要用到數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序--> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!--設(shè)置數(shù)據(jù)庫(kù)的連接url:jdbc:mysql://localhost/hibernate,其中l(wèi)ocalhost表示mysql服務(wù)器名稱,此處為本機(jī), hibernate是數(shù)據(jù)庫(kù)名--> <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate</hibernate> <!--連接數(shù)據(jù)庫(kù)是用戶名--> <property name="hibernate.connection.username">root</property> <!--連接數(shù)據(jù)庫(kù)是密碼--> <property name="hibernate.connection.password">123456</property> <!--數(shù)據(jù)庫(kù)連接池的大小--> <property name="hibernate.connection.pool.size">20</property> <!--是否在后臺(tái)顯示Hibernate用到的SQL語(yǔ)句,開(kāi)發(fā)時(shí)設(shè)置為true,便于差錯(cuò),程序運(yùn)行時(shí)可以在Eclipse的控制臺(tái)顯示Hibernate的執(zhí)行Sql語(yǔ)句。項(xiàng)目部署后可以設(shè)置為false,提高運(yùn)行效率--> <property name="hibernate.show_sql">true</property> <!--jdbc.fetch_size是指Hibernate每次從數(shù)據(jù)庫(kù)中取出并放到JDBC的Statement中的記錄條數(shù)。Fetch Size設(shè)的越大,讀數(shù)據(jù)庫(kù)的次數(shù)越少,速度越快,F(xiàn)etch Size越小,讀數(shù)據(jù)庫(kù)的次數(shù)越多,速度越慢--> <property name="jdbc.fetch_size">50</property> <!--jdbc.batch_size是指Hibernate批量插入,刪除和更新時(shí)每次操作的記錄數(shù)。Batch Size越大,批量操作的向數(shù)據(jù)庫(kù)發(fā)送Sql的次數(shù)越少,速度就越快,同樣耗用內(nèi)存就越大--> <property name="jdbc.batch_size">23</property> <!--jdbc.use_scrollable_resultset是否允許Hibernate用JDBC的可滾動(dòng)的結(jié)果集。對(duì)分頁(yè)的結(jié)果集。對(duì)分頁(yè)時(shí)的設(shè)置非常有幫助--> <property name="jdbc.use_scrollable_resultset">false</property> <!--connection.useUnicode連接數(shù)據(jù)庫(kù)時(shí)是否使用Unicode編碼--> <property name="Connection.useUnicode">true</property> <!--connection.characterEncoding連接數(shù)據(jù)庫(kù)時(shí)數(shù)據(jù)的傳輸字符集編碼方式,最好設(shè)置為gbk,用gb2312有的字符不全--> <property name="connection.characterEncoding">gbk</property> <!--hibernate.dialect 只是Hibernate使用的數(shù)據(jù)庫(kù)方言,就是要用Hibernate連接那種類型的數(shù)據(jù)庫(kù)服務(wù)器。--> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!--指定映射文件為“hibernate/ch2/UserInfo.hbm.xml”--> <mapping resource="org/mxg/UserInfo.hbm.xml"> </session-factory> </hibernate-configuration>
配置文件中映射元素詳解
對(duì)象關(guān)系的映射是用一個(gè)XML文檔來(lái)說(shuō)明的。映射文檔可以使用工具來(lái)生成,如XDoclet,Middlegen和AndroMDA等。下面從一個(gè)映射的例子開(kāi)始講解映射元素,映射文件的代碼如下。
<?xml version="1.0"?> <!-- 所有的XML映射文件都需要定義如下所示的DOCTYPE。 Hibernate會(huì)先在它的類路徑(classptah)中搜索DTD文件。 --> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- hibernate-mapping有幾個(gè)可選的屬性: schema屬性指明了這個(gè)映射的表所在的schema名稱。 default-cascade屬性指定了默認(rèn)的級(jí)聯(lián)風(fēng)格 可取值有 none、save、update。 auto-import屬性默認(rèn)讓我們?cè)诓樵冋Z(yǔ)言中可以使用非全限定名的類名 可取值有 true、false。 package屬性指定一個(gè)包前綴。 --> <hibernate-mapping schema="schemaName" default-cascade="none" auto-import="true" package="test"> <!--用class元素來(lái)定義一個(gè)持久化類 --> <class name="People" table="person"> <!-- id元素定義了屬性到數(shù)據(jù)庫(kù)表主鍵字段的映射。--> <id name="id"> <!-- 用來(lái)為該持久化類的實(shí)例生成唯一的標(biāo)識(shí) --> <generator class="native"/> </id> <!-- discriminator識(shí)別器 是一種定義繼承關(guān)系的映射方法--> <discriminator column="subclass" type="character"/> <!-- property元素為類聲明了一個(gè)持久化的,JavaBean風(fēng)格的屬性--> <property name="name" type="string"> <column name="name" length="64" not-null="true" /> </property> <property name="sex" not-null="true" update="false"/> <!--多對(duì)一映射關(guān)系--> <many-to-one name="friend" column="friend_id" update="false"/> <!--設(shè)置關(guān)聯(lián)關(guān)系--> <set name="friends" inverse="true" order-by="id"> <key column="friend_id"/> <!—一對(duì)多映射--> <o(jì)ne-to-many class="Cat"/> </set> </class> </hibernate-mapping>
組件應(yīng)用的方法
組件有兩種類型,即組件(component)和動(dòng)態(tài)組件(dynamic-component)。在配置文件中,component元素為子對(duì)象的元素與父類對(duì)應(yīng)表的字段建立起映射關(guān)系。然后組件可以聲明它們自己的屬性、組件或者集合。component元素的定義如下所示:
<component name="propertyName" class="className" insert="true|false" upate="true|false" access="field|property|ClassName"> <property ...../> <many-to-one .... /> ........ </component>
在這段代碼中,name是指屬性名,class是類的名字,insert指的是被映射的字段是否出現(xiàn)在SQL的INSERT語(yǔ)句中,upate指出被映射的字段是否出現(xiàn)在SQL的UPDATE語(yǔ)句中,access指出訪問(wèn)屬性的策略。
Hiebernate的基本配置
Hibernate的數(shù)據(jù)庫(kù)連接信息是從配置文件中加載的。Hibernate的配置文件有兩種形式:一種是XML格式的文件,一種是properties屬性文件。properties形式的配置文件默認(rèn)文件名是hibernate.properties,一個(gè)properties形式的配置文件內(nèi)容如下所示:
#指定數(shù)據(jù)庫(kù)使用的驅(qū)動(dòng)類 hibernate.connection.driver_class = com.mysql.jdbc.Driver r #指定數(shù)據(jù)庫(kù)連接串 hibernate.connection.url = jdbc:mysql://localhost:3306/db #指定數(shù)據(jù)庫(kù)連接的用戶名 hibernate.connection.username = user #指定數(shù)據(jù)庫(kù)連接的密碼 hibernate.connection.password = password #指定數(shù)據(jù)庫(kù)使用的方言 hibernate.dialect = net.sf.hibernate.dialect.MySQLDialect #指定是否打印SQL語(yǔ)句 hibernate.show_sql=true
在配置文件中包含了一系列屬性的配置,Hibernate將根據(jù)這些屬性來(lái)連接數(shù)據(jù)庫(kù)。
在XML格式的配置文件中,除了基本的Hibernate配置信息,還可以指定具體的持久化類的映射文件,這可以避免將持久化類的配置文件硬編碼在程序中。XML格式的配置文件的默認(rèn)文件名為hibernate.cfg.xml,一個(gè)XML配置文件的示例如下所示:
<?xml version=''1.0'' encoding=''UTF-8''?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!--顯示執(zhí)行的SQL語(yǔ)句--> <property name="show_sql">true</property> <!--連接字符串--> <property name="connection.url">jdbc:mysql://localhost:3306/STU</property> <!--連接數(shù)據(jù)庫(kù)的用戶名--> <property name="connection.username">root</property> <!--數(shù)據(jù)庫(kù)用戶密碼--> <property name="connection.password">root</property> <!--數(shù)據(jù)庫(kù)驅(qū)動(dòng)--> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!--選擇使用的方言--> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!--映射文件 --> <mapping resource="com/stuman/domain/Admin.hbm.xml" /> <!--映射文件--> <mapping resource="com/stuman/domain/Student.hbm.xml" /> </session-factory> </hibernate-configuration>
properties形式的配置文件和XML格式的配置文件可以同時(shí)使用。當(dāng)同時(shí)使用兩種類型的配置文件時(shí),XML配置文件中的設(shè)置會(huì)覆蓋properties配置文件的相同的屬性。
對(duì)象標(biāo)識(shí)符號(hào)
在關(guān)系數(shù)據(jù)庫(kù)表中,主鍵(Primary Key)用來(lái)識(shí)別記錄,并保證每條記錄的唯一性。在Java語(yǔ)言中,通過(guò)比較兩個(gè)變量所引用對(duì)象的內(nèi)存地址是否相同,或者比較兩個(gè)變量引用的對(duì)象值是否相同來(lái)判斷兩對(duì)象是否相等。Hibernate為了解決兩者之間的不同,使用對(duì)象標(biāo)識(shí)符(OID)來(lái)標(biāo)識(shí)對(duì)象的唯一性。OID是關(guān)系數(shù)據(jù)庫(kù)中主鍵在Java對(duì)象模型中的等價(jià)物。在運(yùn)行時(shí),Hibernate根據(jù)OID來(lái)維持Java對(duì)象和數(shù)據(jù)庫(kù)表中記錄的對(duì)應(yīng)關(guān)系。如下代碼所示,三次調(diào)用了Session的load()方法,分別加載OID為1或3的User對(duì)象。
Transaction tx = session.beginTransaction(); User user1 = (User)session.load(User.class,new Long(1)); User user2 = (User)session.load(User.class,new Long(1)); User user3 = (User)session.load(User.class,new Long(3)); System.out.println( user1 == user2 ); System.out.println( user1 == user3 );
應(yīng)用程序在執(zhí)行上述代碼時(shí),第一次加載OID為1的User對(duì)象,從數(shù)據(jù)庫(kù)中查找ID為1的記錄,然后創(chuàng)建相應(yīng)的User實(shí)例,并把它保存在Session緩存中,最后將該實(shí)例的引用賦值給變量user1。第二次加載OID為1的對(duì)象時(shí),直接把Session緩存中OID為1的實(shí)例的引用賦值給變量user2。因此,表達(dá)式user1==user2的結(jié)果為true。
標(biāo)識(shí)的生成可以使用不同的策略,表1為Hibernate內(nèi)置的標(biāo)識(shí)生成策略。
表1:Hibernate標(biāo)識(shí)生成策略
標(biāo)識(shí)符生成器 | 描述 |
increment | 適用于代理主鍵。由Hibernate自動(dòng)以遞增方式生成。 |
identity | 適用于代理主鍵。由底層數(shù)據(jù)庫(kù)生成標(biāo)識(shí)符。 |
sequence | 適用于代理主鍵。Hibernate根據(jù)底層數(shù)據(jù)庫(kù)的序列生成標(biāo)識(shí)符,這要求底層數(shù)據(jù)庫(kù)支持序列。 |
hilo | 適用于代理主鍵。Hibernate分局high/low算法生成標(biāo)識(shí)符。 |
seqhilo | 適用于代理主鍵。使用一個(gè)高/低位算法來(lái)高效的生成long,short或者int類型的標(biāo)識(shí)符。 |
native | 適用于代理主鍵。根據(jù)底層數(shù)據(jù)庫(kù)對(duì)自動(dòng)生成標(biāo)識(shí)符的方式,自動(dòng)選擇identity、sequence或hilo。 |
uuid.hex | 適用于代理主鍵。Hibernate采用128位的UUID算法生成標(biāo)識(shí)符。 |
uuid.string | 適用于代理主鍵。UUID被編碼成一個(gè)16字符長(zhǎng)的字符串。 |
assigned | 適用于自然主鍵。由Java應(yīng)用程序負(fù)責(zé)生成標(biāo)識(shí)符。 |
foreign | 適用于代理主鍵。使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的標(biāo)識(shí)符。 |
Hibernate映射類型
在對(duì)象/關(guān)系映射文件中,Hibernate采用映射類型作為Java類型和SQL類型的橋梁。Hibernate映射類型分為2種:內(nèi)置映射類型和自定義映射類型。
1、內(nèi)置映射類型
Hibernate對(duì)所有的Java原生類型、常用的Java類型如String、Date等都定義了內(nèi)置的映射類型。表2列出了Hibernate映射類型、對(duì)應(yīng)的Java類型以及對(duì)應(yīng)的標(biāo)準(zhǔn)SQL類型。
表2:Hibernate內(nèi)置映射類型
Hibernate映射類型 | Java類型 | 標(biāo)準(zhǔn)SQL類型 | 大小 |
integer/int | java.lang.Integer/int | INTEGER | 4字節(jié) |
long | java.lang.Long/long | BIGINT | 8字節(jié) |
short | java.lang.Short/short | SMALLINT | 2字節(jié) |
byte | java.lang.Byte/byte | TINYINT | 1字節(jié) |
float | java.lang.Float/float | FLOAT | 4字節(jié) |
double | java.lang.Double/double | DOUBLE | 8字節(jié) |
big_decimal | java.math.BigDecimal | NUMERIC | |
character | java.lang.Character/java.lang.String/char | CHAR(1) | 定長(zhǎng)字符 |
string | java.lang.String | VARCHAR | 變長(zhǎng)字符 |
boolean/ yes_no/true_false | java.lang.Boolean/Boolean | BIT | 布爾類型 |
date | java.util.Date/java.sql.Date | DATE | 日期 |
timestamp | java.util.Date/java.util.Timestamp | TIMESTAMP | 日期 |
calendar | java.util.Calendar | TIMESTAMP | 日期 |
calendar_date | java.util.Calendar | DATE | 日期 |
binary | byte[] | BLOB | BLOB |
text | java.lang.String | TEXT | CLOB |
serializable | 實(shí)現(xiàn)java.io.Serializablej接口的任意Java類 | BLOB | BLOB |
clob | java.sql.Clob | CLOB | CLOB |
blob | java.sql.Blob | BLOB | BLOB |
class | java.lang.Class | VARCHAR | 定長(zhǎng)字符 |
locale | java.util.Locale | VARCHAR | 定長(zhǎng)字符 |
timezone | java.util.TimeZone | VARCHAR | 定長(zhǎng)字符 |
currency | java.util.Currency | VARCHAR | 定長(zhǎng)字符 |
hibernate-mapping
這個(gè)元素包括三個(gè)可選的屬性。schema屬性,指明了這個(gè)映射所引用的表所在的schema名稱。假若指定了這個(gè)屬性,表名會(huì)加上所指定的schema的名字?jǐn)U展為全限定名。假若沒(méi)有指定,表名就不會(huì)使用全限定名。default-cascade指定了未明確注明cascade屬性的Java屬性和集合類Java會(huì)采取什么樣的默認(rèn)級(jí)聯(lián)風(fēng)格。auto-import屬性默認(rèn)讓我們?cè)诓樵冋Z(yǔ)言中可以使用非全限定名的類名。
<hibernate-mapping schema="schemaName" default-cascade="none|save-update" auto-import="true|false" package="package.name" />
schema (可選): 數(shù)據(jù)庫(kù)schema名稱。
default-cascade (可選 - 默認(rèn)為 none): 默認(rèn)的級(jí)聯(lián)風(fēng)格。
auto-import (可選 - 默認(rèn)為 true): 指定是否我們可以在查詢語(yǔ)言中使用非全限定的類名(僅限于本映射文件中的類)。
package (可選): 指定一個(gè)包前綴,如果在映射文檔中沒(méi)有指定全限定名,就使用這個(gè)包名。
假若你有兩個(gè)持久化類,它們的非全限定名是一樣的(就是在不同的包里面--譯者注),你應(yīng)該設(shè)置auto-import="false"。假若說(shuō)你把一個(gè)“import過(guò)”的名字同時(shí)對(duì)應(yīng)兩個(gè)類, Hibernate會(huì)拋出一個(gè)異常。
5.1.3. class
你可以使用class元素來(lái)定義一個(gè)持久化類:
<class name="ClassName" table="tableName" discriminator-value="discriminator_value" mutable="true|false" schema="owner" proxy="ProxyInterface" dynamic-update="true|false" dynamic-insert="true|false" select-before-update="true|false" polymorphism="implicit|explicit" where="arbitrary sql where condition" (11) persister="PersisterClass" (12) batch-size="N" (13) optimistic-lock="none|version|dirty|all" (14) lazy="true|false" (15) />
name: 持久化類(或者接口)的Java全限定名。
table: 對(duì)應(yīng)的數(shù)據(jù)庫(kù)表名。
discriminator-value(辨別值) (可選 - 默認(rèn)和類名一樣):一個(gè)用于區(qū)分不同的子類的值,在多態(tài)行為時(shí)使用。
mutable(可變) (可選, 默認(rèn)值為 true): 表明該類的實(shí)例可變(不可變)。
schema (可選): 覆蓋在根<hibernate-mapping>元素中指定的schema名字。
proxy (可選): 指定一個(gè)接口,在延遲裝載時(shí)作為代理使用。你可以在這里使用該類自己的名字。
dynamic-update(動(dòng)態(tài)更新) (可選,默認(rèn)為false): 指定用于UPDATE 的SQL將會(huì)在運(yùn)行時(shí)動(dòng)態(tài)生成,并且只更新那些改變過(guò)的字段。
dynamic-insert(動(dòng)態(tài)插入) (可選, 默認(rèn)為false): 指定用于INSERT的 SQL 將會(huì)在運(yùn)行時(shí)動(dòng)態(tài)生成,并且只包含那些非空值字段。
select-before-update (可選,默認(rèn)值為false): 指定Hibernate除非確定對(duì)象的確被修改了,不會(huì)執(zhí)行SQL UPDATE操作。在特定場(chǎng)合(實(shí)際上,只會(huì)發(fā)生在一個(gè)臨時(shí)對(duì)象關(guān)聯(lián)到一個(gè)新的session中去,執(zhí)行update()的時(shí)候),這說(shuō)明Hibernate會(huì)在UPDATE之前執(zhí)行一次額外的SQL SELECT操作,來(lái)決定是否應(yīng)該進(jìn)行UPDATE。
polymorphism(多形,多態(tài)) (可選, 默認(rèn)值為 implicit (隱式)): 界定是隱式還是顯式的使用查詢多態(tài)。
(11) where (可選) 指定一個(gè)附加的SQLWHERE 條件,在抓取這個(gè)類的對(duì)象時(shí)會(huì)一直增加這個(gè)條件。
(12) persister (可選): 指定一個(gè)定制的ClassPersister。
(13) batch-size (可選,默認(rèn)是1) 指定一個(gè)用于根據(jù)標(biāo)識(shí)符抓取實(shí)例時(shí)使用的"batch size"(批次抓取數(shù)量)。
(14) optimistic-lock(樂(lè)觀鎖定) (可選,默認(rèn)是version): 決定樂(lè)觀鎖定的策略。
(15) lazy(延遲) (可選): 假若設(shè)置 lazy="true",就是設(shè)置這個(gè)類自己的名字作為proxy接口的一種等價(jià)快捷形式。
若指明的持久化類實(shí)際上是一個(gè)接口,也可以被完美地接受。其后你可以用<subclass>來(lái)指定該接口的實(shí)際實(shí)現(xiàn)類名。你可以持久化任何static(靜態(tài)的)內(nèi)部類。記得應(yīng)該使用標(biāo)準(zhǔn)的類名格式,就是說(shuō)比如:Foo$Bar。
不可變類,mutable="false"不可以被應(yīng)用程序更新或者刪除。這可以讓Hibernate做一些小小的性能優(yōu)化。
可選的proxy屬性可以允許延遲加載類的持久化實(shí)例。Hibernate開(kāi)始會(huì)返回實(shí)現(xiàn)了這個(gè)命名接口的CGLIB代理。當(dāng)代理的某個(gè)方法被實(shí)際調(diào)用的時(shí)候,真實(shí)的持久化對(duì)象才會(huì)被裝載。參見(jiàn)下面的“用于延遲裝載的代理”。
Implicit (隱式)的多態(tài)是指,如果查詢中給出的是任何超類、該類實(shí)現(xiàn)的接口或者該類的名字,都會(huì)返回這個(gè)類的實(shí)例;如果查詢中給出的是子類的名字,則會(huì)返回子類的實(shí)例。 Explicit (顯式)的多態(tài)是指,只有在查詢中給出的明確是該類的名字時(shí)才會(huì)返回這個(gè)類的實(shí)例;同時(shí)只有當(dāng)在這個(gè)<class>的定義中作為<subclass>或者<joined-subclass>出現(xiàn)的子類,才會(huì)可能返回。大多數(shù)情況下,默認(rèn)的polymorphism="implicit"都是合適的。顯式的多態(tài)在有兩個(gè)不同的類映射到同一個(gè)表的時(shí)候很有用。(允許一個(gè)“輕型”的類,只包含部分表字段)。
persister屬性可以讓你定制這個(gè)類使用的持久化策略。你可以指定你自己實(shí)現(xiàn)的net.sf.hibernate.persister.EntityPersister的子類,你甚至可以完全從頭開(kāi)始編寫一個(gè)net.sf.hibernate.persister.ClassPersister接口的實(shí)現(xiàn),可能是用儲(chǔ)存過(guò)程調(diào)用、序列化到文件或者LDAP數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)的。參閱net.sf.hibernate.test.CustomPersister,這是一個(gè)簡(jiǎn)單的例子(“持久化”到一個(gè)Hashtable)。
請(qǐng)注意dynamic-update和dynamic-insert的設(shè)置并不會(huì)繼承到子類,所以在<subclass>或者<joined-subclass>元素中可能需要再次設(shè)置。這些設(shè)置是否能夠提高效率要視情形而定。請(qǐng)用你的智慧決定是否使用。
使用select-before-update通常會(huì)降低性能.當(dāng)是在防止數(shù)據(jù)庫(kù)不必要的觸發(fā)update觸發(fā)器,這就很有用了。
如果你打開(kāi)了dynamic-update,你可以選擇幾種樂(lè)觀鎖定的策略:
version(版本檢查)檢查version/timestamp字段
all(全部) 檢查全部字段
dirty(臟檢查)只檢察修改過(guò)的字段
none(不檢查)不使用樂(lè)觀鎖定
我們非常強(qiáng)烈建議你在Hibernate中使用version/timestamp字段來(lái)進(jìn)行樂(lè)觀鎖定。對(duì)性能來(lái)說(shuō),這是最好的選擇,并且這也是唯一能夠處理在session外進(jìn)行操作的策略(就是說(shuō),當(dāng)使用Session.update()的時(shí)候)。
5.1.4. id
被映射的類必須聲明對(duì)應(yīng)數(shù)據(jù)庫(kù)表主鍵字段。大多數(shù)類有一個(gè)JavaBeans風(fēng)格的屬性,為每一個(gè)實(shí)例包含唯一的標(biāo)識(shí)。<id> 元素定義了該屬性到數(shù)據(jù)庫(kù)表主鍵字段的映射。
<id name="propertyName" type="typename" column="column_name" unsaved-value="any|none|null|id_value" access="field|property|ClassName"> <generator class="generatorClass"/> </id>
name (可選): 標(biāo)識(shí)屬性的名字。
type (可選): 標(biāo)識(shí)Hibernate類型的名字。
column (可選 - 默認(rèn)為屬性名): 主鍵字段的名字。
unsaved-value (可選 - 默認(rèn)為null): 一個(gè)特定的標(biāo)識(shí)屬性值,用來(lái)標(biāo)志該實(shí)例是剛剛創(chuàng)建的,尚未保存。這可以把這種實(shí)例和從以前的session中裝載過(guò)(可能又做過(guò)修改--譯者注)但未再次持久化的實(shí)例區(qū)分開(kāi)來(lái)。
access (可選 - 默認(rèn)為property): Hibernate用來(lái)訪問(wèn)屬性值的策略。
如果 name屬性不存在,會(huì)認(rèn)為這個(gè)類沒(méi)有標(biāo)識(shí)屬性。
unsaved-value 屬性很重要!如果你的類的標(biāo)識(shí)屬性不是默認(rèn)為null的,你應(yīng)該指定正確的默認(rèn)值。
還有一個(gè)另外的<composite-id>聲明可以訪問(wèn)舊式的多主鍵數(shù)據(jù)。我們強(qiáng)烈不鼓勵(lì)使用這種方式。
5.1.4.1. generator
必須聲明的<generator>子元素是一個(gè)Java類的名字,用來(lái)為該持久化類的實(shí)例生成唯一的標(biāo)識(shí)。如果這個(gè)生成器實(shí)例需要某些配置值或者初始化參數(shù),用<param>元素來(lái)傳遞。
<id name="id" type="long" column="uid" unsaved-value="0"> <generator class="net.sf.hibernate.id.TableHiLoGenerator"> <param name="table">uid_table</param> <param name="column">next_hi_value_column</param> </generator> </id>
所有的生成器都實(shí)現(xiàn)net.sf.hibernate.id.IdentifierGenerator接口。這是一個(gè)非常簡(jiǎn)單的接口;某些應(yīng)用程序可以選擇提供他們自己特定的實(shí)現(xiàn)。當(dāng)然,Hibernate提供了很多內(nèi)置的實(shí)現(xiàn)。下面是一些內(nèi)置生成器的快捷名字:
increment(遞增)
用于為long, short或者int類型生成唯一標(biāo)識(shí)。只有在沒(méi)有其他進(jìn)程往同一張表中插入數(shù)據(jù)時(shí)才能使用。在集群下不要使用。
identity
對(duì)DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的內(nèi)置標(biāo)識(shí)字段提供支持。返回的標(biāo)識(shí)符是long, short 或者int類型的。
sequence (序列)
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的標(biāo)識(shí)符是long, short或者 int類型的。
hilo (高低位)
使用一個(gè)高/低位算法來(lái)高效的生成long, short或者 int類型的標(biāo)識(shí)符。給定一個(gè)表和字段(默認(rèn)分別是是hibernate_unique_key 和next)作為高位值得來(lái)源。高/低位算法生成的標(biāo)識(shí)符只在一個(gè)特定的數(shù)據(jù)庫(kù)中是唯一的。在使用JTA獲得的連接或者用戶自行提供的連接中,不要使用這種生成器。
seqhilo(使用序列的高低位)
使用一個(gè)高/低位算法來(lái)高效的生成long, short或者 int類型的標(biāo)識(shí)符,給定一個(gè)數(shù)據(jù)庫(kù)序列(sequence)的名字。
uuid.hex
用一個(gè)128-bit的UUID算法生成字符串類型的標(biāo)識(shí)符。在一個(gè)網(wǎng)絡(luò)中唯一(使用了IP地址)。UUID被編碼為一個(gè)32位16進(jìn)制數(shù)字的字符串。
uuid.string
使用同樣的UUID算法。UUID被編碼為一個(gè)16個(gè)字符長(zhǎng)的任意ASCII字符組成的字符串。不能使用在PostgreSQL數(shù)據(jù)庫(kù)中
native(本地)
根據(jù)底層數(shù)據(jù)庫(kù)的能力選擇identity, sequence 或者h(yuǎn)ilo中的一個(gè)。
assigned(程序設(shè)置)
讓應(yīng)用程序在save()之前為對(duì)象分配一個(gè)標(biāo)示符。
foreign(外部引用)
使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的標(biāo)識(shí)符。和<one-to-one>聯(lián)合一起使用。
“Hiebernate的基本配置和映射類型介紹”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。