溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Hiebernate的基本配置和映射類型介紹

發(fā)布時(shí)間:2021-09-09 09:15:21 來(lái)源:億速云 閱讀:164 作者:chen 欄目:編程語(yǔ)言

本篇內(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"/>  <!&mdash;一對(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/intjava.lang.Integer/intINTEGER4字節(jié)
longjava.lang.Long/longBIGINT8字節(jié)
shortjava.lang.Short/shortSMALLINT2字節(jié)
bytejava.lang.Byte/byteTINYINT1字節(jié)
floatjava.lang.Float/floatFLOAT4字節(jié)
doublejava.lang.Double/doubleDOUBLE8字節(jié)
big_decimaljava.math.BigDecimalNUMERIC 
characterjava.lang.Character/java.lang.String/charCHAR(1)定長(zhǎng)字符
stringjava.lang.StringVARCHAR變長(zhǎng)字符
boolean/ yes_no/true_falsejava.lang.Boolean/BooleanBIT布爾類型
datejava.util.Date/java.sql.DateDATE日期
timestampjava.util.Date/java.util.TimestampTIMESTAMP日期
calendarjava.util.CalendarTIMESTAMP日期
calendar_datejava.util.CalendarDATE日期
binarybyte[]BLOB

BLOB
textjava.lang.StringTEXTCLOB
serializable實(shí)現(xiàn)java.io.Serializablej接口的任意Java類BLOBBLOB
clobjava.sql.ClobCLOBCLOB
blobjava.sql.BlobBLOBBLOB
classjava.lang.ClassVARCHAR定長(zhǎng)字符
localejava.util.LocaleVARCHAR定長(zhǎng)字符
timezonejava.util.TimeZoneVARCHAR定長(zhǎng)字符
currencyjava.util.CurrencyVARCHAR定長(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í)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI