




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、 Hibernate 初識構(gòu)建Hibernate 基礎代碼 1 POJOPOJO 在Hibernate 語義中理解為數(shù)據(jù)庫表所對應的Domain Object。這里的POJO就是所謂的“Plain Ordinary Java Object”,字面上來講就是無格式普通Java 對象,簡單的可以理解為一個不包含邏輯代碼的值對象(Value Object 簡稱VO)。2 Hibernate 映射文件Hibernate 從本質(zhì)上來講是一種“對象關系型數(shù)據(jù)映射”(Object RelationalMapping 簡稱ORM)。前面的POJO在這里體現(xiàn)的就是ORM中Object層的語義,而映射(Mappi
2、ng)文件則是將對象(Object)與關系型數(shù)據(jù)(Relational)相關聯(lián)的紐帶,在Hibernate中,映射文件通常以“.hbm.xml”作為后綴。由數(shù)據(jù)庫產(chǎn)生基礎代碼通過Hibernate官方提供的MiddleGen for Hibernate 和Hibernate_Extension工具包,我們可以很方便的根據(jù)現(xiàn)有數(shù)據(jù)庫,導出數(shù)據(jù)庫表結(jié)構(gòu),生成ORM和POJO1) 首先,將Middlegen-Hibernate軟件包解壓縮( 如解壓縮到C:Middlegen )。2) 配置目標數(shù)據(jù)庫參數(shù)進入MiddleGen 目錄下的configdatabase 子目錄,根據(jù)我們實際采用的數(shù)據(jù)庫打開
3、對應的配置文件。如這里我們用的是mysql數(shù)據(jù)庫,對應的就是mysql.xml文件。<property name="database.script.file"value="$src.dir/sql/$name-mysql.sql"/><property name="database.driver.file"value="$lib.dir/mysql.jar"/><property name="database.driver.classpath"value="
4、;$database.driver.file"/><property name="database.driver"value="org.gjt.mm.mysql.Driver"/><property name="database.url"value="jdbc:mysql:/localhost/sample"/><property name="database.userid"value="user"/><propert
5、y name="database.password"value="mypass"/><property name="database.schema"value=""/><property name="database.catalog"value=""/><property name="jboss.datasource.mapping"value="mySQL"/>修改MiddleGen 根目錄下
6、的build.xml 文件,此文件是Middlegen-Hibernate 的Ant構(gòu)建配置。Middlegen-Hibernate將根據(jù)build.xml文件中的具體參數(shù)生成數(shù)據(jù)庫表映射文件。可配置的項目包括:a) 目標數(shù)據(jù)庫配置文件地址查找關鍵字 ”!ENTITY”,得到:<!DOCTYPE project <!ENTITY database SYSTEM"file:./config/database/hsqldb.xml">>默認情況下,MiddleGen 采用的是hsqldb.xml,將其修改為我們所用的數(shù)據(jù)庫配置文件(mysql.xml):
7、<!DOCTYPE project <!ENTITY database SYSTEM"file:./config/database/mysql.xml">>b) Application name查找:<property name="name" value="airline"/>“aireline”是MiddleGen原始配置中默認的 Application Name,將其修改為我們所希望的名稱,如“HibernateSample”:<property name="name"
8、 value="HibernateSample"/>c) 輸出目錄查找關鍵字“name="build.gen-src.dir"”,得到:<property name="build.gen-src.dir"value="$build.dir/gen-src"/>修改value="$build.dir/gen-src"使其指向我們所期望的輸出目錄,這里我們修改為:<property name="build.gen-src.dir"value="C
9、:sample"/>d) 對應代碼的Package name查找關鍵字“destination”,得到:<hibernatedestination="$build.gen-src.dir"package="$name.hibernate"genXDocletTags="false"genIntergratedCompositeKeys="false"javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper&
10、quot;/>可以看到,hibernate 節(jié)點package 屬性的默認設置實際上是由前面的Application Name ($name)和“.hibernate”組合而成,根據(jù)我們的需要,將其改為:<hibernatedestination="$build.gen-src.dir"package="org.hibernate.sample"genXDocletTags="true"genIntergratedCompositeKeys="false"javaTypeMapper="mid
11、dlegen.plugins.hibernate.HibernateJavaTypeMapper"/>這里還有一個屬性genXDocletTags,如果設置為true,則生成的代碼將包含xdoclet tag,這為以后在開發(fā)過程中借助xdoclet進行映射調(diào)整提供了幫助。關于Hibernate的xdoclet使用,請參見“高級特性”中的相關內(nèi)容。注意,如果使用的數(shù)據(jù)庫為SQLServer,需要將build.xml 中如下部分(下劃線部分)刪除,否則Middlegen會報出找不到表的錯誤。<middlegenappname="$name"prefsdir
12、="$src.dir"gui="$gui"databaseurl="$database.url"initialContextFactory="$java.naming.factory.initial"providerURL="$vider.url"datasourceJNDIName="$"driver="$database.driver"username="$database
13、.userid"password="$database.password"schema="$database.schema"catalog="$database.catalog">在MiddleGen 根目錄下運行ant,就將出現(xiàn)MiddleGen的界面:1 Domain Class Name對應POJO 的類名2 Key Generator主鍵產(chǎn)生器可選項說明:1) Assigned主鍵由外部程序負責生成,無需Hibernate參與。2) hilo通過hi/lo 算法實現(xiàn)的主鍵生成機制,需要額外的數(shù)據(jù)庫表保存主鍵生成
14、歷史狀態(tài)。3) seqhilo與hilo 類似,通過hi/lo 算法實現(xiàn)的主鍵生成機制,只是主鍵歷史狀態(tài)保存在Sequence中,適用于支持Sequence的數(shù)據(jù)庫,如Oracle。4) increment主鍵按數(shù)值順序遞增。此方式的實現(xiàn)機制為在當前應用實例中維持一個變量,以保存著當前的最大值,之后每次需要生成主鍵的時候?qū)⒋酥导?作為主鍵。這種方式可能產(chǎn)生的問題是:如果當前有多個實例訪問同一個數(shù)據(jù)庫,那么由于各個實例各自維護主鍵狀態(tài),不同實例可能生成同樣的主鍵,從而造成主鍵重復異常。因此,如果同一數(shù)據(jù)庫有多個實例訪問,此方式必須避免使用。5) identity采用數(shù)據(jù)庫提供的主鍵生成機制。如D
15、B2、SQL Server、MySQL中的主鍵生成機制6) sequence采用數(shù)據(jù)庫提供的sequence 機制生成主鍵。如Oralce 中的Sequence。7) native由Hibernate根據(jù)底層數(shù)據(jù)庫自行判斷采用identity、hilo、sequence其中一種作為主鍵生成方式。8) uuid.hex由Hibernate基于128 位唯一值產(chǎn)生算法生成16 進制數(shù)值(編碼后以長度32 的字符串表示)作為主鍵。9) uuid.string與uuid.hex 類似,只是生成的主鍵未進行編碼(長度16)。在某些數(shù)據(jù)庫中可能出現(xiàn)問題(如PostgreSQL)10) foreign使用外
16、部表的字段作為主鍵。3 如果需要采用定制的主鍵產(chǎn)生算法,則在此處配置主鍵生成器,主鍵生成器必須實現(xiàn)net.sf.hibernate.id.IdentifierGenerator 接口。4 Schema Name數(shù)據(jù)庫Schema Name。5 Persister自定義持久類實現(xiàn)類類名。如果系統(tǒng)中還需要Hibernate 之外的持久層實現(xiàn)機制,如通過存儲過程得到目標數(shù)據(jù)集,甚至從LDAP中獲取數(shù)據(jù)來填充我們的POJO。6 Enable proxies是否使用代理(用于延遲加載Lazy Loading)。7 Dynamic Update如果選定,則生成Update SQL 時不包含未發(fā)生變動的字段
17、屬性,這樣可以在一定程度上提升SQL執(zhí)行效能。8 Mutable類是否可變,默認為選定狀態(tài)(可變)。如果不希望應用程序?qū)Υ祟悓臄?shù)據(jù)記錄進行修改(如對于數(shù)據(jù)庫視圖),則可將取消其選定狀態(tài),之后對此類的Delete和Update操作都將失效。9 Implement the Lifecyle interface是否實現(xiàn)Lifecyle接口。Lifecyle接口提供了數(shù)據(jù)固化過程中的控制機制,通過實現(xiàn)Lifecyle接口,我們可以在數(shù)據(jù)庫操作中加入回調(diào)(Call Back)機制,如在數(shù)據(jù)庫操作之前,之后觸發(fā)指定操作。10 Implement the Validatable interface是否實
18、現(xiàn)Validatable接口。通過實現(xiàn)Validatable接口,我們可以在數(shù)據(jù)被固化到數(shù)據(jù)庫表之前對其合法性進行驗證。值得注意的是,通過實現(xiàn)Lifecyle接口,我們同樣可以在數(shù)據(jù)操作之前驗證數(shù)據(jù)合法性,不同的是,Validatable 接口中定義的validate 方法可能會被調(diào)用多次,因此設計中應避免在Validatable 接口的validate 方法實現(xiàn)中加入業(yè)務邏輯的驗證。1 Hibernate mapping specialty映射類型:Key :主鍵Property :屬性Version :用于實現(xiàn)optimistic locking,參見“高級特性”章節(jié)中關于optimist
19、ic locking的描述2 Java property name字段對應的Java 屬性名3 Java Type字段對應的Java 數(shù)據(jù)類型4 Column updateable生成Update SQL時是否包含本字段。5 Column insertable生成Insert SQL時是否包含本字段。=POJO 的生成工作可以通過Hibernate Extension 來完成,Hibernate Extension 的toolsbin目錄下包含三個工具:1 hbm2java.bat根據(jù)映射文件生成對應的POJO。通過MiddleGen 我們已經(jīng)得到了映射文件,下一步就是通過hbm2java.b
20、at工具生成對應的POJO。2 class2hbm.bat根據(jù)POJO class 生成映射文件,這個工具很少用到,這里也就不再詳細介紹。3 ddl2hbm.bat由數(shù)據(jù)庫導出庫表結(jié)構(gòu),并生成映射文件以及POJO。這個功能與MiddleGen的功能重疊,但由于目前還不夠成熟(實際上已經(jīng)被廢棄,不再維護),提供的功能也有限,所以我們還是采用MiddleGen生成映射文件,之后由hbm2java根據(jù)映射文件生成POJO 的方式。打開toolsbinsetenv.bat 文件,修改其中的JDBC_DRIVER和HIBERNATE_HOME環(huán)境變量,使其指向我們的實際JDBC Driver文件和Hib
21、ernate所在目錄,如*set JDBC_DRIVER=c:mysqlmysql.jarset HIBERNATE_HOME=c:hibernate*同時檢查一下環(huán)境變量CP中的各個項目中是否實際存在,特別是%CORELIB%下的jar文件,某些版本的發(fā)行包中,默認配置中的文件名與實際的文件名有所出入(如%CORELIB%commons-logging.jar, 在Hibernate 發(fā)行包中,可能實際的文件名是commons-logging-.jar,諸如此類)。使用hbm2java,根據(jù)MiddleGen生成的映射文件生成Java 代碼:打開Command Window,在toolsbi
22、n目錄下執(zhí)行:*hbm2java c:sampleorghibernatesample*.xml -output=c:sampleHibernate 配置配置文件名默認為“”(或者perties),Hibernate 初始化期間會自動在CLASSPATH 中尋找這個文件,并讀取其中的配置信息,為后期數(shù)據(jù)庫操作做好準備。一個典型的配置文件如下:<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-configurationPUBLIC "-/
23、Hibernate/Hibernate Configuration DTD/EN"dtd"><hibernate-configuration><!- SessionFactory 配置 -><session-factory><!- 數(shù)據(jù)庫URL -><property name="hibernate.connection.url">jdbc:mysql:/localhost/sample</property><!- 數(shù)據(jù)庫JDBC驅(qū)動 -><property
24、name="hibernate.connection.driver_class"></property><!- 數(shù)據(jù)庫用戶名 -><property name="hibernate.connection.username">User</property><!- 數(shù)據(jù)庫用戶密碼 -><property name="hibernate.connection.password">myPass</property><!-dialect ,每個數(shù)據(jù)庫
25、都有其對應的Dialet以匹配其平臺特性 -><property name="dialect"></property><!- 是否將運行期生成的SQL輸出到日志以供調(diào)試 -><property name="hibernate.show_sql">True</property><!- 是否使用數(shù)據(jù)庫外連接 -><property name="hibernate.use_outer_join">True</property><!-
26、事務管理類型,這里我們使用JDBC Transaction -><property name="hibernate.transaction.factory_class"></property><!映射文件配置,注意配置文件名必須包含其相對于根的全路徑 -><mapping resource="net/xiaxin/xdoclet/TUser.hbm.xml"/><mapping resource="net/xiaxin/xdoclet/TGroup.hbm.xml"/>
27、</session-factory></hibernate-configuration>一個典型的perties配置文件如下:hibernate.connection.url jdbc:mysql:/samplehibernate.connection.username userhibernate.connection.password mypass* Hibernate基礎語義1 數(shù)據(jù)庫URL2 數(shù)據(jù)庫用戶3 數(shù)據(jù)庫用戶密碼4 數(shù)據(jù)庫JDBC驅(qū)動類5 數(shù)據(jù)庫dialect,用于對特定數(shù)據(jù)庫提供支持,其中包含了針對特定數(shù)據(jù)庫特性的實現(xiàn),如Hib
28、ernate數(shù)據(jù)類型到特定數(shù)據(jù)庫數(shù)據(jù)類型的映射等。當我們調(diào)用:Configuration config = new Configuration().configure();時,Hibernate會自動在當前的CLASSPATH 中搜尋文件并將其讀取到內(nèi)存中作為后繼操作的基礎配置。Configuration 類一般只有在獲取SessionFactory時需要涉及,當獲取SessionFactory 之后,由于配置信息已經(jīng)由Hibernate 維護并綁定在返回的SessionFactory之上,因此一般情況下無需再對其進行操作。我們也可以指定配置文件名,如果不希望使用默認的文件作為配置文件的話:F
29、ile file = new File("c:samplemyhibernate.xml");Configuration config = new Configuration().configure(file);SessionFactorySessionFactory 負責創(chuàng)建Session 實例。我們可以通過Configuation 實例構(gòu)建SessionFactory:Configuration config = new Configuration().configure();SessionFactory sessionFactory = config.buildSes
30、sionFactory();Configuration實例config會根據(jù)當前的配置信息,構(gòu)造SessionFactory實例并返回。SessionFactory 一旦構(gòu)造完畢,即被賦予特定的配置信息。也就是說,之后config 的任何變更將不會影響到已經(jīng)創(chuàng)建的SessionFactory 實例(sessionFactory)。如果需要使用基于改動后的config 實例的SessionFactory,需要從config 重新構(gòu)建一個SessionFactory實例.SessionSession是持久層操作的基礎,相當于JDBC中的Connection。Session實例通過SessionFa
31、ctory實例構(gòu)建:Configuration config = new Configuration().configure();SessionFactory sessionFactory = config.buildSessionFactory();Session session = sessionFactory.openSession();*Find:String hql= " from TUser where name='Erica'"List userList = session.find(hql);*Save:TUser user = new TU
32、ser();user.setName("Emma");session.save(user);session.flush();最后調(diào)用Session.flush方法強制數(shù)據(jù)庫同步,這里即強制Hibernate將user實例立即同步到數(shù)據(jù)庫中。如果在事務中則不需要flush方法,在事務提交的時候,hibernate自動會執(zhí)行flush方法,另外當Session關閉時,也會自動執(zhí)行flush方法。Hibernate高級特性XDoclet 與Hibernate 映射XDoclet已經(jīng)廣泛運用在EJB開發(fā)中,在其最新版本里,包含了一個為Hibernate提供支持的子類庫Hiberna
33、te Doclet,其中包含了生成Hibernate映射文件所需的ant構(gòu)建支持以及java doc tag支持。XDoclet實現(xiàn)基本原理是,通過在Java代碼加入特定的JavaDoc tag,從而為其添加特定的附加語義,之后通過XDoclet工具對代碼中JavaDoc Tag進行分析,自動生成與代碼對應的配置文件,XDoclet。*其中用到了兩個hibernate doclet tag,hibernate.class和perty。這兩個tag分別描述了POJO所對應的數(shù)據(jù)庫表信息,以及其字段對應的庫表字段信息。之后Hibernate Doclet就會根據(jù)這些信息生
34、成映射文件:<hibernate-mapping><classname="net.xiaxin.xdoclet.TUser"table="TUser"><propertyname="name"type="java.lang.String"column="name"not-null="true"length="50"></class></hibernate-mapping>常用Hibernate-D
35、oclet Tag介紹:1. Class 層面:1) hibernate.class描述POJO 與數(shù)據(jù)庫表之間的映射關系,并指定相關的運行參數(shù)。參數(shù) 描述 類型 必須table 類對應的表名默認值:當前類名Text Ndynamic-update 生成Update SQL時,僅包含發(fā)生變動的字段默認值: falseBool Ndynamic-insert 生成Insert SQL時,僅包含非空(null)字段默認值:falseBool NProxy 代理類默認值:空Text Ndiscriminator-value 子類辨別標識,用于多態(tài)支持。 Text Nwhere 數(shù)據(jù)甄選條件,如果只需
36、要處理庫表中某些特定數(shù)據(jù)的時候,可通過此選項設定結(jié)果集限定條件。如用戶表中保存了全國所有用戶的數(shù)據(jù),而我們的系統(tǒng)只是面向上海用戶,則可指定where=”location=Shanghai"Text N注釋:目前看到27頁,繼續(xù)Hibernate.pdf(共92頁)典型場景:/* hibernate.class* table="TUser" (1)* dynamic-update="true" (2)* dynamic-insert="true" (3)* proxy=” (4)* discriminator-value=”1
37、” (5)*/public class TUser implements Serializable 1 table參數(shù)指定了當前類(TUser)對應數(shù)據(jù)庫表“TUser”。2 dynamic-update 參數(shù)設定為生成Update SQL 時候,只包括當前發(fā)生變化的字段(提高DB Update性能)。3 Dynamic-insert 參數(shù)設定為生成Insert SQL 時候,只包括當前非空字段。(提高DB Insert性能)4 Proxy 參數(shù)為空,表明當前類不使用代理(Proxy)。代理類的作用是為LazyLoading提供支持5 discriminator-value參數(shù)設為”1”。di
38、scriminator-value 參數(shù)的目的是對多態(tài)提供支持。2) hibernate.discriminatorhibernate.discriminator(識別器) 用于提供多態(tài)支持。參數(shù) 描述 類型 必須Column 用于區(qū)分各子類的字段名稱。 text Y默認值:當前類名type 對應的Hibernate類型 Bool Nlength 字段長度 Bool N2. Method層面:1) hibernate.id描述POJO 中關鍵字段與數(shù)據(jù)庫表主鍵之間的映射關系。參數(shù) 描述 類型 必須column 主鍵字段名 默認值:當前類名 Text Ntype 字段類型。Hibernate 總
39、是使用對象型數(shù)據(jù)類型作 Text N 為字段類型,如int對應Integer,因此這里將id設為基本類型如int以避免對象創(chuàng)建的開銷的思路是沒有實際意義的,即使這里設置為基本類型,Hibernate內(nèi)部還是會使用對象型數(shù)據(jù)對其進行處理,只是返回數(shù)據(jù)的時候再轉(zhuǎn)換為基本類型而已。length 字段長度 Text Nunsaved-value 用于對象是否已經(jīng)保存的判定值。 Text Ngenerator-class 主鍵產(chǎn)生方式(詳見Hibernate QuickStart中關于MiddleGen的相關說明)取值可為下列值中的任意一個:assigned,hiloSeqhilo,increment,
40、identity,sequence,native, Text Yuuid.hex,uuid.string,foreign描述POJO 中屬性與數(shù)據(jù)庫表字段之間的映射關系。參數(shù) 描述 類型 必須column 數(shù)據(jù)庫表字段名默認值:當前類名 Text Ntype 字段類型 Text Nlength 字段長度 Text Nnot-null 字段是否允許為空 Bool Nunique 字段是否唯一(是否允許重復值) Bool Ninsert Insert 操作時是否包含本字段數(shù)據(jù) Bool N默認:trueupdate Update 操作時是否包含本字段數(shù)據(jù)默認:true Bool N包含XDocle
41、t Tag的代碼必須由xdoclet程序進行處理以生成對應的映射文件,xdoclet的處理模塊可通過ant進行加載,下面是一個簡單的hibernate xdoclet的ant構(gòu)建腳本(注意實際使用時需要根據(jù)實際情況對路徑和CLASSPATH設定進行調(diào)整):<?xml version="1.0"?><project name="Hibernate" default="hibernate" basedir="."><property name="xdoclet.lib.home&
42、quot; value="C:xdoclet-lib"/><target name="hibernate" depends=""description="Generates Hibernate class descriptor files."><taskdef name="hibernatedoclet"classname="xdoclet.modules.hibernate.HibernateDocletTask"><classpath&
43、gt;<fileset dir="$xdoclet.lib.home"><include name="*.jar"/></fileset></classpath></taskdef><hibernatedocletdestdir="./src/"excludedtags="version,author,todo"force="true"verbose="true"mergedir="."&g
44、t;<fileset dir="./src/"><include name="*/hibernate/sample/*.java"/></fileset><hibernate version="2.0"/></hibernatedoclet></target></project>除了上面我們介紹的Hibernate Doclet Tag,其他還有:Class層面;hibernate.cachehibernate.jcs-cachehibernate.j
45、oined-subclasshibernate.joined-subclass-keyhibernate.queryMethod層面hibernate.arrayhibernate.baghibernate.collection-cachehibernate.collection-composite-elementhibernate.collection-elementhibernate.collection-indexhibernate.collection-jcs-cachehibernate.collection-keyhibernate.collection-key-columnhib
46、ernate.collection-many-to-manyhibernate.collection-one-to-manyhibernate.columnponenthibernate.generator-paramhibernate.index-many-to-manyhibernate.listhibernate.many-to-onehibernate.maphibernate.one-to-onehibernate.primitive-arrayhibernate.sethibernate.timestamphibernate.version數(shù)據(jù)檢索1. Criteria Query
47、2. Hibernate Query Language (HQL)3. SQLCriteria QueryCriteria Query通過面向?qū)ο蠡脑O計,將數(shù)據(jù)查詢條件封裝為一個對象。簡單來講,Criteria Query可以看作是傳統(tǒng)SQL的對象化表示,如:Criteria criteria = session.createCriteria(TUser.class);criteria.add(Expression.eq("name","Erica");criteria.add(Expression.eq("sex",new Int
48、eger(1);注意:這里的criteria 實例實際上是SQL “Select * from t_user where name=Erica and sex=1”的封裝(我們可以打開Hibernate 的show_sql 選項,以觀察Hibernate在運行期生成的SQL語句)。Hibernate 在運行期會根據(jù)Criteria 中指定的查詢條件(也就是上面代碼中通過criteria.add方法添加的查詢表達式)生成相應的SQL語句。Criteria 查詢表達式Criteria 本身只是一個查詢?nèi)萜?,具體的查詢條件需要通過Criteria.add方法添加到Criteria實例中。如前例所示,
49、Expression 對象具體描述了查詢條件。針對SQL 語法,Expression提供了對應的查詢限定機制,包括:方法描述Expression.eq 對應SQL“field = value”表達式。如Expression.eq("name","Erica")Expression.allEq 參數(shù)為一個Map對象,其中包含了多個屬性值對應關系。相當于多個Expression.eq關系的疊加。Expression.gt 對應SQL中的 “field > value ” 表達式Expression.ge 對應SQL中的 “field >= val
50、ue” 表達式Expression.lt 對應SQL中的 “field < value” 表達式Expression.le 對應SQL中的 “field <= value” 表達式Expression.between對應SQL中的 “between” 表達式如下面的表達式表示年齡(age)位于13到50區(qū)間內(nèi)。Expression.between("age",newInteger(13),new Integer(50);Expression.like 對應SQL中的 “field like value” 表達式Expression.in 對應SQL中的 ”fie
51、ld in ” 表達式Expression.eqProperty 用于比較兩個屬性之間的值,對應SQL中的“field= field”。如:Expression.eqProperty("TUser.groupID","TGroup.id");Expression.gtProperty 用于比較兩個屬性之間的值,對應SQL中的“field> field”。Expression.geProperty 用于比較兩個屬性之間的值,對應SQL中的“field>= field”。Expression.ltProperty用于比較兩個屬性之間的值,對應SQ
52、L中的“field< field”。Expression.leProperty 用于比較兩個屬性之間的值,對應SQL中的“field<= field”。Expression.and and關系組合。如:Expression.and(Expression.eq("name","Erica"),Expression.eq("sex",new Integer(1);Expression.oror關系組合。如:Expression.sql 作為補充,本方法提供了原生SQL語法的支持。我們可以通過這個方法直接通過SQL語句限定查詢條
53、件。下面的代碼返回所有名稱以“Erica”起始的記錄:Expression.sql(“l(fā)ower() like lower(?)”,"Erica%",Hibernate.STRING);其中的“alias”將由Hibernate在運行期使用當前關聯(lián)的POJO別名替換。Criteria 高級特性限定返回的記錄范圍通過criteria. setFirstResult/setMaxResults 方法可以限制一次查詢返回的記錄范圍:Criteria criteria = session.createCriteria(TUser.class);/限定查詢返回檢索
54、結(jié)果中,從第一百條結(jié)果開始的20條記錄criteria.setFirstResult(100);criteria.setMaxResults(20);對查詢結(jié)果進行排序/查詢所有groupId=2的記錄/并分別按照姓名(順序)和groupId(逆序)排序Criteria criteria = session.createCriteria(TUser.class);criteria.add(Expression.eq("groupId",new Integer(2);criteria.addOrder(Order.asc("name");criteria.
55、addOrder(Order.desc("groupId");Criteria作為一種對象化的查詢封裝模式,不過由于Hibernate在實現(xiàn)過程中將精力更加集中在HQL查詢語言上,因此Criteria的功能實現(xiàn)還沒做到盡善盡美(這點上,OJB的Criteria 實現(xiàn)倒是值得借鑒),因此,在實際開發(fā)中,建議還是采用Hibernate 官方推薦的查詢封裝模式:HQL。 Hibernate Query Language (HQL)相對Criteria,HQL提供了更接近傳統(tǒng)SQL語句的查詢語法,也提供了更全面的特性。最簡單的一個例子:String hql = "from
56、 org.hibernate.sample.TUser"Query query = session.createQuery(hql);List userList = query.list();上面的代碼將取出TUser的所有對應記錄。如果我們需要取出名為“Erica”的用戶的記錄,類似SQL,我們可以通過SQL 語句加以限定:String hql ="from org.hibernate.sample.TUser as user where ='Erica'"Query query = session.createQuery(hq
57、l);List userList = query.list();其中我們新引入了兩個子句“as”和“where”,as子句為類名創(chuàng)建了一個別名,而where子句指定了限定條件。HQL子句本身大小寫無關,但是其中出現(xiàn)的類名和屬性名必須注意大小寫區(qū)分。 數(shù)據(jù)關聯(lián)一對一關聯(lián)配置:Hibernate中的一對一關聯(lián)由“one-to-one”節(jié)點定義one-to-one關系定義比較簡單,只需在主控方加以定義。這里,我們的目標是由TUser 對象獲取其對應的TGroup 對象。因此TUser 對象是主控方,為了實現(xiàn)一對一關系,我們在TUser 對象的映射文件TUser.hbm.xml 中加入one-to-one節(jié)點,對TGroup對象進行一對一關聯(lián):<hibernate-mapping><cla
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/IEC 14496-10:2025 EN Information technology - Coding of audio-visual objects - Part 10: Advanced video coding
- 單位工程劃分課件編寫
- 赫山區(qū)考編數(shù)學試卷
- 黃陂四年級數(shù)學試卷
- 漢中龍崗初一數(shù)學試卷
- 2025年山東省齊河縣一中高一物理第二學期期末質(zhì)量跟蹤監(jiān)視模擬試題含解析
- 2025年中國旋轉(zhuǎn)吊具行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 2025年衛(wèi)浴樹脂項目可行性分析報告
- 2025年高空作業(yè)車項目投資分析及可行性報告
- 高爐布袋除塵器項目投資可行性研究分析報告(2024-2030版)
- 【詩歌鑒賞】2025屆高三下4月名校??荚囶}
- 口腔科針刺傷處理流程
- 雞蛋庫房管理制度
- 小學生書法知識講座課件
- 新能源汽車故障診斷技術 教案 教案4- BMS故障診斷檢修
- 北師大版五年級下冊數(shù)學口算題題庫1200道帶答案可打印
- 完整版高中古詩文必背72篇【原文+注音+翻譯】
- 空天地協(xié)同網(wǎng)絡的邊緣計算與資源分配的優(yōu)化策略與實踐
- 普通話測試命題說話(2024年新版)50則
- 《工業(yè)機器人編程》課件 任務2 單工件搬運任務實現(xiàn)
- 2025年傳染病防控技能競賽筆試理論考試題庫600題(附答案)
評論
0/150
提交評論