版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1 新建項(xiàng)目2 學(xué)習(xí)建立user-library-hibernate,并加入相應(yīng)的jar包 a項(xiàng)目右鍵-build path-configure build path-add library b選擇user-library,在其中新建library,命命為hibernate c 在該library中加入hibernate所需要的jar包hibernate /hibernate3.jar/lib/required目錄下的所有包 6個(gè)Sl4j-nop jar3 引入mysql的JDBC驅(qū)動(dòng)包4 在MYSQL中建數(shù)據(jù)庫(kù)和相應(yīng)的表student(id,name,age) 參考文檔中COPY,修改對(duì)應(yīng)的
2、數(shù)據(jù)庫(kù)連接,6 建立student類7 建立映射文件Student.hbm.xml 參考相應(yīng)文檔8 將映射文件加到hibernate-cfg.xml中搭建日志環(huán)境并配置顯示DDL語(yǔ)句slf的實(shí)現(xiàn):slf4j nodep ,log4j ,jdk logging api ,apache common-log.slf4j.nop.jar是slf-api.jar其相應(yīng)的接口實(shí)現(xiàn)把slf的接口對(duì)到log4j的實(shí)現(xiàn),在user library中hibernate,把slf的實(shí)現(xiàn)slf4j-nop-.jar去掉,添加log4j的實(shí)現(xiàn)log4j-1.2.15.jar,再添加一個(gè)slf-api和log4j轉(zhuǎn)換器
3、slf4j-log4j12-1.5.8.jar.把slf的接口轉(zhuǎn)換成log4j的接口.最后添加一個(gè)log4j的配置文件perties利用HIBERNATE導(dǎo)出數(shù)據(jù)庫(kù)建表Configuration cfg=new AnnotationConfiguration().configure();(有注解時(shí)使用AnnotationConfiguration),configure()可以手動(dòng)指定配置文件名稱.Configuration cfg=new Configuration(),會(huì)默認(rèn)讀取perties文件/創(chuàng)建schemaExport對(duì)象importddl
4、.SchemaExport;SchemaExport export=new SchemaExport(cfg);/創(chuàng)建數(shù)據(jù)庫(kù)表export.create(true, true);對(duì)象映射(采用Annotation注解方式)1 建表 Create table teacher(id int primary key,name varchar(20),title varchar(20);2 創(chuàng)建teacher類,并進(jìn)行注解importy;import ;在bean中加注解 Entity,Id(加在getId()上面)3 在hibernate中加入annotation相應(yīng)的jar包hibernate-a
5、nnotations.jar/lib目錄下加入相應(yīng)的包ejb3-persistence.jar, hibernate-commons-annotations.jar注意:annotation文檔中并沒(méi)有提到hibernate-annotations.jar包4 參考annotation文檔建立對(duì)應(yīng)的注解5 在hibernate.cfg.xml中建立映射 6 示例/AnnotationConfiguration;Configuration cfg=new AnnotationConfiguration();SessionFactory sf=cfg.configure().buildSessio
6、nFactory();Session session=sf.openSession();session.beginTransaction();session.save(t);/session.getTransaction().commit();session.close();sf.close();對(duì)象映射(采用配置文件方式)1 在相應(yīng)的類中建立對(duì)應(yīng)的配置文件. 例如Student類對(duì)應(yīng)的配置文件2 在hibernate.cfg.xml中添加該映射文件即可 注意包名的寫(xiě)法3 示例Configuration cfg=new Configuration().configure();/創(chuàng)建Sessio
7、nFactorySessionFactory sf=cfg.configure().buildSessionFactory();/創(chuàng)建sessionSession session=sf.openSession();session.beginTransaction();session.save(s);session.getTransaction().commit();session.close();sf.close();hibernate.cfg.xml配置hibernate.hbm2ddl.auto屬性取值: validate | update | create | create-drop在s
8、essionfactory創(chuàng)建時(shí),自動(dòng)檢查數(shù)據(jù)結(jié)構(gòu),或者將數(shù)據(jù)庫(kù)schema(表)的DDL導(dǎo)出到數(shù)據(jù)庫(kù),使用create-drop時(shí),在顯式關(guān)閉sessionfactory時(shí),將drop掉數(shù)據(jù)庫(kù)schema.validate 加載hibernate時(shí),驗(yàn)證創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu) create 每次加載hibernate,重新創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu) create-drop 加載hibernate時(shí)創(chuàng)建,退出是刪除表結(jié)構(gòu) update 加載hibernate自動(dòng)更新數(shù)據(jù)庫(kù)結(jié)構(gòu)表名和類名不同的情況時(shí),對(duì)表名進(jìn)行配置1 在注解中import javax.persistence.Table;Table(name=”
9、TableName”)2 在XML文件中 配置對(duì)應(yīng)的table屬性為相應(yīng)的表名字段名和屬性名相同,默認(rèn)為對(duì)于annotation,如果什么注解都不寫(xiě)的話,相當(dāng)于加了注解Basic實(shí)體bean中所有的非static非transient的屬性都可以被持久化, 除非你將其注解為T(mén)ransient.所有沒(méi)有定義注解的屬性等價(jià)于在其上面添加了Basic注解. 通過(guò) Basic注解可以聲明屬性的獲取策略(fetch strategy):對(duì)于XML文件中不用寫(xiě)column.字段名和屬性名不同時(shí)Annotation:column(name=”column_name”)加上相應(yīng)的getXXX()方法上XML:c
10、olumn屬性不需要persistence的字段import javax.persistence.Transient; Transient 意思是說(shuō)這個(gè)屬性是透明的,不進(jìn)行持久化,存儲(chǔ)的時(shí)候不存進(jìn)去映射日期和時(shí)間類型,指定時(shí)間精度Annotation: import javax.persistence.Temporal;Temporal(TemporalType.TIME)XML:指定typetype=time或date枚舉類型的轉(zhuǎn)換Enumerated(EnumType.STRING)字段映射的位置推薦寫(xiě)在gexXXX方法上Hibernate映射類型Hibernate 映射類型 Java 類
11、型 標(biāo)準(zhǔn) SQL 類型 大小和取值范圍 integer 或者 int int 或者 eger INTEGER 4 字節(jié) long long Long BIGINT 8 字節(jié) short short Short SMALLINT 2 字節(jié) byte byte Byte TINYINT 1 字節(jié) float float Float FLOAT 4 字節(jié) double double Double DOUBLE 8 字節(jié) big_decimal NUMERIC NUMERIC(8,2)8 位 character char Character String CHAR(1) 定長(zhǎng)字符 string Str
12、ing VARCHAR 變長(zhǎng)字符串 boolean boolean Boolean BIT 布爾類型 yes_no boolean Boolean CHAR(1) (Y-N) 布爾類型 true_false boolean Boolean CHAR(1) (T-F) 布爾類型 2 、 Java 時(shí)間和日期類型的 Hibernate 映射 映射類型 Java 類型 標(biāo)準(zhǔn) SQL 類型 描述 date util.Date 或者 sql.Date DATE YYYY-MM-DD time Date Time TIME HH:MM:SS timestamp Date Timestamp TIMESTA
13、MP YYYYMMDDHHMMSS calendar calendar TIMESTAMP YYYYMMDDHHMMSS calendar_date calendar DATE YYYY-MM-DD 3 、 Java 大對(duì)象類型的 Hibernate 映射類型 映射類型 Java 類型 標(biāo)準(zhǔn) SQL 類型 MySQL 類型 Oracle 類型 binary byte VARBINARY( 或 BLOB) BLOB BLOB text String CLOB TEXT CLOB serializable Serializable 接口任意實(shí)現(xiàn)類 VARBINARY( 或 BLOB) BLOB B
14、LOB clob jav CLOB TEXT CLOB blob BLOB BLOB BLOB 在程序中通過(guò) Hibernate 來(lái)保存 java.sql.Clob 或者 java.sql.Blob 實(shí)例時(shí),必須包含兩個(gè)步驟: 1 在一個(gè)數(shù)據(jù)庫(kù)事務(wù)中先保存一個(gè)空的 Blob 或 Clob 實(shí)例。 2 接著鎖定這條記錄,更新上面保存的 Blob 或 Clob 實(shí)例,把二進(jìn)制數(shù)據(jù)或文本數(shù)據(jù)寫(xiě)到 Blob 或 Clob 實(shí)例中 Hibernate SQL方言 (hibernate.dialect) RDBMS方言 DB2DB2 AS/400DB2 OS390PostgreSQLMySQL.MySQL
15、DialectMySQL with InnoDBMySQL with MyISAMOracle (any version)Oracle 9i/10gSybaseSybase AnywhereMicrosoft SQL ServerSAP DBInformixHypersonicSQLIngresProgressMckoi SQLInterbasePointbaseFrontBaseFirebirdID生成策略1.XML方式配置可選的子元素是一個(gè)Java類的名字, 用來(lái)為該持久化類的實(shí)例生成唯一的標(biāo)識(shí)。如果這個(gè)生成器實(shí)例需要某些配置值或者初始化參數(shù), 用元素來(lái)傳遞。 uid_table next
16、_hi_value_column 所有的生成器都實(shí)現(xiàn)org.hibernate.id.IdentifierGenerator接口。 這是一個(gè)非常簡(jiǎn)單的接口;某些應(yīng)用程序可以選擇提供他們自己特定的實(shí)現(xiàn)。當(dāng)然, Hibernate提供了很多內(nèi)置的實(shí)現(xiàn)。下面是一些內(nèi)置生成器的快捷名字: l increment 用于為long, short或者int類型生成 唯一標(biāo)識(shí)。只有在沒(méi)有其他進(jìn)程往同一張表中插入數(shù)據(jù)時(shí)才能使用。 在集群下不要使用。 l identity 對(duì)DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的內(nèi)置標(biāo)識(shí)字段提供支持。 返回的標(biāo)識(shí)符是long
17、, short 或者int類型的。 l sequence 在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的標(biāo)識(shí)符是long, short或者 int類型的。 l hilo 使用一個(gè)高/低位算法高效的生成long, short 或者 int類型的標(biāo)識(shí)符。給定一個(gè)表和字段(默認(rèn)分別是 hibernate_unique_key 和next_hi)作為高位值的來(lái)源。 高/低位算法生成的標(biāo)識(shí)符只在一個(gè)特定的數(shù)據(jù)庫(kù)中是唯一的。 l seqhilo 使用一個(gè)高/低位算法來(lái)高效的生成l
18、ong, short 或者 int類型的標(biāo)識(shí)符,給定一個(gè)數(shù)據(jù)庫(kù)序列(sequence)的名字。 l uuid 用一個(gè)128-bit的UUID算法生成字符串類型的標(biāo)識(shí)符, 這在一個(gè)網(wǎng)絡(luò)中是唯一的(使用了IP地址)。UUID被編碼為一個(gè)32位16進(jìn)制數(shù)字的字符串。 l guid 在MS SQL Server 和 MySQL 中使用數(shù)據(jù)庫(kù)生成的GUID字符串。 l native 根據(jù)底層數(shù)據(jù)庫(kù)的能力選擇identity, sequence 或者h(yuǎn)ilo中的一個(gè)。在mysql中默認(rèn)的是auto_increment,SQLSERVER中是identity.l assigned 讓?xiě)?yīng)用程序在save()之
19、前為對(duì)象分配一個(gè)標(biāo)示符。這是 元素沒(méi)有指定時(shí)的默認(rèn)生成策略。 l select 通過(guò)數(shù)據(jù)庫(kù)觸發(fā)器選擇一些唯一主鍵的行并返回主鍵值來(lái)分配一個(gè)主鍵。 l foreign 使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的標(biāo)識(shí)符。通常和聯(lián)合起來(lái)使用。 l sequence-identity 一種特別的序列生成策略,使用數(shù)據(jù)庫(kù)序列來(lái)生成實(shí)際值,但將它和JDBC3的getGeneratedKeys結(jié)合在一起,使得在插入語(yǔ)句執(zhí)行的時(shí)候就返回生成的值。目前為止只有面向JDK 1.4的Oracle 10g驅(qū)動(dòng)支持這一策略。注意,因?yàn)镺racle驅(qū)動(dòng)程序的一個(gè)bug,這些插入語(yǔ)句的注釋被關(guān)閉了。(原文:Note comments on
20、 these insert statements are disabled due to a bug in the Oracle drivers.) 2 annotation中配置id生成策略使用Id注解可以將實(shí)體bean中的某個(gè)屬性定義為標(biāo)識(shí)符(identifier). 該屬性的值可以通過(guò)應(yīng)用自身進(jìn)行設(shè)置, 也可以通過(guò)Hiberante生成(推薦). 使用 GeneratedValue注解可以定義該標(biāo)識(shí)符的生成策略: 有四種策略l AUTO -默認(rèn)值.可以是identity column類型,或者sequence類型或者table類型,取決于不同的底層數(shù)據(jù)庫(kù).對(duì)于MYSQL,是auto_in
21、crement,對(duì)于Oracle是hibernate-sequence.l TABLE - 使用表保存id值 (了解)l IDENTITY - identity column l SEQUENCE - SequenceGeneratorGeneratedValue(strategy=GenerationType.XXXX)XXXX取值為T(mén)ype.SEQUENCE|TABLE|AUTO|IDENTITY不同的數(shù)據(jù)庫(kù)對(duì)應(yīng)著不同的生成策略.例1實(shí)體類注解Entity主鍵進(jìn)行注解IdGeneratedValue 默認(rèn)值是GeneratedValue(strategy=GenerationType.AU
22、TO)例2使用SequenceGeneratorEntitySequenceGenerator(name=teacher_SEQUENCE,sequenceName=teacher_SEQUENCE_DB)name是用戶自定義的generator生成器的名字, sequenceName是生成到數(shù)據(jù)庫(kù)后sequence對(duì)象的名字.在實(shí)體中注解好后,就可以在id注解上寫(xiě)上對(duì)應(yīng)的IdGeneratedValue(strategy=GenerationType.IDENTITY,generator=teacher_SEQUENCE)例3表生成器(了解),這種方式會(huì)另外生成一個(gè)表.實(shí)體類注解Entity
23、javax.persistence.TableGenerator(/了解,更適合用于跨平臺(tái)跨數(shù)據(jù)庫(kù). name=TEACHER_GEN, /生成器generator的名字 table=GENERATOR_TABLE,/生成的表名 pkColumnName = pk_key,/生成的表的字段名 valueColumnName = pk_value,/生成的表的字段的值 pkColumnValue=teacher,/ pk_key字段的值 allocationSize=1/自增變量)主鍵注解IdGeneratedValue(strategy=GenerationType.TABLE,generat
24、or=TEACHER_GEN)l 聯(lián)合主鍵生成策略一般采用這種方式,比如有一個(gè)類Student(id,name,age),為了產(chǎn)生聯(lián)合主鍵,把id和name分離出來(lái).Student(pk,age) StudentPk(id,name)StudentPk類必需實(shí)現(xiàn)序列化接口implements.StudentPk類必需重寫(xiě)boolean equals() ,int hasCode()方法Overridepublic boolean equals(Object o) if(o instanceof StudentPk) StudentPk pk = (StudentPk)o;if(this.id
25、= pk.getId() & .equals(pk.getName() return true;return false;Overridepublic int hashCode() return .hashCode();聯(lián)合主鍵生成策略XML配置方法聯(lián)合主鍵生成策略annotation配置方法定義組合主鍵的三種方式:l (少用)將組件類注解為Embeddable,并將組件的屬性注解為Id.實(shí)體模型Teacher(teacherPK,age) TeacherPk(id,name)在TeacherPk(id,name)中把類注解Embeddable在Teache
26、r(teacherPK,age)中把組件屬性teacherPK注解Idl 將組件的屬性注解為EmbeddedId. 實(shí)體模型Teacher(teacherPK,age) TeacherPk(id,name)只需要在Teacher(teacherPK,age)中把組件屬性teacherPK注解EmbeddedIdl (推薦使用)將類注解為IdClass,并將該實(shí)體中所有屬于主鍵的屬性都注解為Id. 實(shí)體模型Teacher(id,name,age) TeacherPk(id,name)在Teacher(id,name,age)中把類注解IdClass(value=”TeacherPk.Class”
27、),在主鍵屬性id,name上注解Id即可.當(dāng)IdClass()中只有一個(gè)屬性默認(rèn)寫(xiě)成IdClass(TeacherPk.Class).也就是說(shuō)Teacher里面的組件屬性id,name,合起來(lái)剛好是類TeacherPk.對(duì)象的三種狀態(tài)三種狀態(tài)的區(qū)別在于:有沒(méi)有ID,ID在數(shù)據(jù)庫(kù)中有沒(méi)有,在內(nèi)存中有沒(méi)有(session緩存)三種狀態(tài)Transient:內(nèi)存中的一個(gè)對(duì)象,沒(méi)有ID,緩存中也沒(méi)有Persistent:內(nèi)存中有,緩存中有,數(shù)據(jù)庫(kù)中有IDDetached:內(nèi)存中有,緩存中沒(méi)有,數(shù)據(jù)庫(kù)有ID核心接口開(kāi)發(fā)介紹Configuration1 AnnotationConfiguration2 進(jìn)
28、行配置信息的管理3 用來(lái)產(chǎn)生SessionFactory:buildSessionFactory()4 可以在configure()方法中指定hibernate配置文件SchemaExport可以在程序中控制生成建表語(yǔ)名.位于包import org.hibernate.tool.hbm2ddl.SchemaExport;create(booleanscript,booleanexport)script - print the DDL to the console export - export the script to the databaseConfiguration cfg=new An
29、notationConfiguration().configure();SchemaExport export=new SchemaExport(cfg);export.create(true, true);或者new SchemaExport(new AnnotationConfiguration().configure().create(false, true);SessionFactory1 用來(lái)產(chǎn)生和管理sesssion2 通常情況下,每個(gè)應(yīng)用只需要一個(gè)SessionFactory,除非要訪問(wèn)多個(gè)數(shù)據(jù)庫(kù)的情況3 openSession()與openSession()l openSess
30、ion()總是創(chuàng)建新的session,需要手動(dòng)close().l getCurrentSession()事務(wù)自動(dòng)提交并且自動(dòng)關(guān)閉.從上下文環(huán)境中獲得session,如果當(dāng)時(shí)環(huán)境中不存就創(chuàng)建新的.如果環(huán)境中存在就使用環(huán)境中的,而且每次得到的都是同一個(gè)session(在session提交之前,提交之后就是新的了).用途:界定事務(wù)邊界.l 所謂的上下文參見(jiàn)配置文件thread取值范圍 jta | thread | managed | custom.Class JTA簡(jiǎn)介Session管理一個(gè)數(shù)據(jù)庫(kù)的任務(wù)單元,即管理數(shù)據(jù)庫(kù)中的增刪改查操作,提交事務(wù).方法CRUD:save(),delete(),upd
31、ate(),saveOrUpdate(),load(),get(),clear().session.beginTransaction();session.save(Object obj);session.getTransaction().commit();session.close();get()與load()的區(qū)別l 查找時(shí),都會(huì)優(yōu)先從session的緩存中查找.l 查找不存在對(duì)應(yīng)記錄時(shí),表現(xiàn)不一樣.load方法查找不到時(shí)不會(huì)報(bào)錯(cuò),get查找不到時(shí)會(huì)報(bào)錯(cuò).l Load返回的是代理對(duì)象,等到真正要用到對(duì)象的內(nèi)容時(shí)才發(fā)起SQL語(yǔ)句.get直接發(fā)起SQL語(yǔ)句從數(shù)據(jù)庫(kù)中取出,不會(huì)延遲.Update(
32、)方法1 用來(lái)更新detached對(duì)象,更新完成之后成為persistent.2 更新transient對(duì)象會(huì)報(bào)錯(cuò). 更新自己設(shè)定id(前提是id在數(shù)據(jù)庫(kù)中存在)的transient對(duì)象可以.3 持久化的對(duì)象只要設(shè)定不同字段就會(huì)發(fā)生更新4 更新部分更改的字段(三種方法)l XML設(shè)定property標(biāo)簽的update=true|false屬性,annotation設(shè)定Column(updatable=false)屬性,這種方式少用,不靈活.l XML設(shè)定class標(biāo)簽的dynamic-update=”true”屬性,同一個(gè)session中可以,跨session不行.跨session時(shí)的實(shí)現(xiàn)方法
33、不過(guò)可以用session的merge().merge方法會(huì)先從數(shù)據(jù)庫(kù)load,將得到的和數(shù)據(jù)庫(kù)中的進(jìn)行對(duì)比,再u(mài)pdate更改過(guò)的字段.JPA1.0 Annotation沒(méi)有對(duì)應(yīng)的屬性,Hibernatel 使用HQL(EJBQL)(建議使用)clear()方法:清除session中的緩存.調(diào)用clear()方法會(huì)強(qiáng)制清除session緩存.不會(huì)與數(shù)據(jù)庫(kù)打交道.flush()方法:當(dāng)session的事務(wù)提交后,會(huì)強(qiáng)制進(jìn)行從內(nèi)存(session緩存)到數(shù)據(jù)庫(kù)的同步.默認(rèn)情況下是session的事務(wù)提交時(shí)才同步.不常用.Query接口關(guān)系映射這里的關(guān)系映射指的是對(duì)象之間的關(guān)系,并不是指數(shù)據(jù)庫(kù)的關(guān)系
34、. 關(guān)系映射解決的問(wèn)題是,當(dāng)對(duì)象處于各種關(guān)系時(shí),數(shù)據(jù)庫(kù)表該如何映射,編程時(shí)如何處理.一對(duì)一:單向(主鍵,外鍵),雙向(主鍵,外鍵)一對(duì)多:單向,雙向(和多對(duì)一雙向相同)多對(duì)一:單向,雙向(一對(duì)多雙向和多對(duì)一雙向是一樣的)多對(duì)多:單向,雙向(一對(duì)一單/雙向主鍵關(guān)聯(lián)映射,只作了解)集合映射:list ,map,set繼承映射(了解):單表,多表,一張主表多張子表組件映射:Embeddable,Embedded一對(duì)一(one to one) 單向關(guān)聯(lián)映射兩個(gè)對(duì)象是一對(duì)一的的關(guān)系.有兩種策略可以實(shí)現(xiàn)一對(duì)一的關(guān)聯(lián)映射l 主鍵關(guān)聯(lián):即讓兩個(gè)對(duì)象具有相同的主鍵值,以表明他們之間的一對(duì)一的對(duì)應(yīng)關(guān)系;數(shù)據(jù)庫(kù)表不
35、會(huì)有額外的字段來(lái)維護(hù)他們之間的關(guān)系,僅通過(guò)表的主鍵關(guān)系來(lái)維護(hù).一對(duì)一主鍵關(guān)聯(lián)映射默認(rèn)了級(jí)聯(lián)屬性,其關(guān)聯(lián)對(duì)象會(huì)同時(shí)存儲(chǔ).所以不會(huì)拋出TransientObjectException異常.l 唯一外鍵關(guān)聯(lián):外鍵關(guān)聯(lián),本來(lái)是用于多對(duì)一的配置,但是如果加上唯一的限制之后,也可以表示一對(duì)一的關(guān)聯(lián)關(guān)系. unique=true.單向關(guān)聯(lián),如Person-person_id;加載person信息時(shí)能關(guān)聯(lián)對(duì)應(yīng)的person_id信息雙向關(guān)系,加載任何一方,都能關(guān)聯(lián)出別一方的信息.注意id的主鍵生成策略,foreign使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的標(biāo)識(shí)符。通常和聯(lián)合起來(lái)使用。類Person(id,name,idCa
36、rd), 類IdCard(id,cardNo)一對(duì)一(單向)基于主鍵關(guān)聯(lián)映射(了解)XML配置方法一對(duì)一單向主鍵關(guān)聯(lián)通常使用一個(gè)特定的id生成器。 idCard one-to-one不會(huì)加載字段,它告訴HIBERNATE怎樣加載其引用對(duì)象.如何加載呢,默認(rèn)根據(jù)主鍵加載其引用對(duì)象.如在t_person中查到id=2,自動(dòng)加載t_idCard中id=2的對(duì)象信息. constrained=true,表明person主鍵是個(gè)外鍵,表示當(dāng)前主鍵上存在著idCard約束,當(dāng)前主鍵id作為外鍵,參照了idCard.idCard表明person中的id來(lái)源于idCard,也就是共享idCard的主鍵.Ann
37、otation配置一對(duì)一(單向)主鍵關(guān)聯(lián)映射.(BUG)OneToOnePrimaryKeyJoinColumn有BUG,系統(tǒng)不會(huì)生成主鍵映射.推薦使用XML配置方法.一對(duì)一(單向)基于外鍵關(guān)聯(lián)映射和單向多對(duì)一關(guān)聯(lián)幾乎是一樣的。唯一不同的就是單向一對(duì)一關(guān)聯(lián)中的外鍵字段具有唯一性約束。這種方法會(huì)在表中生成一個(gè)新的外鍵字段.如果不限制外字段的唯一性約束,就會(huì)導(dǎo)致產(chǎn)生多對(duì)一的關(guān)聯(lián). 指定多的一端unique=true,這樣就限制了多的一端的多重性為一. 這種狀態(tài)注意TransientObjectException異常.在保存時(shí)就先保存外鍵idCard,再保存Person類.一對(duì)一單向外鍵關(guān)聯(lián)Anno
38、tation配置OneToOneJoinColumn(name=指定生成的外鍵字段名字)一對(duì)一(雙向)主鍵關(guān)聯(lián)映射(了解)PersonIdCard.在另一端也加上一個(gè)一對(duì)一的單向關(guān)聯(lián)映射.模型對(duì)象Person(id,name,idCard) IdCard(id,cardNo,person)中,雙方都持有對(duì)方的屬性引用.一對(duì)一(雙向)主鍵關(guān)聯(lián)映射XML配置方式在IdCard配置中建立映射,指示Hibernate如何加載,默認(rèn)情況下根據(jù)主鍵加載.也就是在基于單向一對(duì)一的映射中, 在另一端也加上一個(gè)單向一對(duì)一的主鍵關(guān)聯(lián)映射.在Person一端配置 idCard 在另一端IdCard配置 一對(duì)一(雙向
39、)主鍵關(guān)聯(lián)映射Annotation(有BUG)在兩端各自的引用屬性上加上OneToOnePrimaryKeyJoinColumn一對(duì)一(雙向)唯一外鍵關(guān)聯(lián)映射Person-IdCard.在另一端也加上一個(gè)一對(duì)一的單向關(guān)聯(lián)映射.在模型對(duì)象Person(id,name,idCard) IdCard(id,cardNo,person),雙方都持有對(duì)方的屬性引用.需要在另一端加上,指示hibernate如何加載,默認(rèn)情況下根據(jù)主鍵加載person;因?yàn)橥怄I關(guān)聯(lián)映射中,兩個(gè)實(shí)體的關(guān)系是由person的外鍵idCard來(lái)維護(hù)的,所以不能指定person的主鍵來(lái)加載person,而應(yīng)根據(jù)person的外鍵i
40、dCard來(lái)加載person對(duì)象.一對(duì)一雙向外鍵關(guān)聯(lián)映射XML配置方式Person一端:用多對(duì)一配置外鍵唯一形成一對(duì)一的配置方式. IdCard一端:一對(duì)一,引用另一端外鍵 要想加載idCard,如果不加property-ref,默認(rèn)根據(jù)person主鍵id來(lái)加載,property- ref=idCard就指示hibernate從person里面的idCard屬性來(lái)加載.一對(duì)一雙向外鍵關(guān)聯(lián)映射Annotation配置方式雙方互持對(duì)方的屬性的引用關(guān)系模型Husband(id,name,wife) Wife(id,name,husband)在Husband一端的wife屬性上注解OneToOne/
41、JoinColumn在Wife一端的husband加上注解,mappedByOneToOne(mappedBy=wife)引用屬性加上mappedBy屬性后就可以在wife這一端告知這個(gè)關(guān)聯(lián)是在wife屬性上設(shè)置的.就不用管理wife這一端生成的husband的設(shè)置.生成的wife表格不會(huì)有husband字段.規(guī)律:有雙向關(guān)聯(lián)時(shí)mappedBy通常必設(shè).聯(lián)合主鍵一對(duì)一單向外鍵關(guān)聯(lián)映射對(duì)象模型Wife(id,name,age) WifePk(id,name)Husband(id,name,wife)1 在Wife中建立聯(lián)合主鍵生成策略 IdClass(WifePk.Class) Id2 在Hus
42、band中添加個(gè)外鍵即可 OneToOne3自定義Husband中外鍵的名字 OneToOneJoinColumns(JoinColumn(name=wifeId, referencedColumnName=id),JoinColumn(name=wifeName, referencedColumnName=name)XML配置方式:略組件映射對(duì)象關(guān)系:一個(gè)對(duì)象是另一個(gè)對(duì)象的一部分?jǐn)?shù)據(jù)庫(kù)表:是一張表Annotation:Embeddable,EmbeddedXML:對(duì)象模型Husband(id,name,wife)Wife(wifeName,wifeAge)Annotation:在Husban
43、d的wife屬性上建立注解Embedded 表明該對(duì)象是從別的位置嵌入過(guò)來(lái)的,是不需要單獨(dú)映射的表.這種方式生成的表為husband(id,name,wifename,wifeage),不會(huì)生成wife表.AttributeOverride注解可以覆蓋該屬性對(duì)應(yīng)的嵌入式對(duì)象的列映射:XML: 多對(duì)一(many to one)單向關(guān)聯(lián)映射多對(duì)一的數(shù)據(jù)庫(kù)設(shè)計(jì)原則:在多的那下端加外鍵/注意在創(chuàng)建實(shí)體類屬性時(shí)應(yīng)盡量避免與SQL語(yǔ)句中的關(guān)鍵字重名.多對(duì)一單向關(guān)聯(lián)映射實(shí)體模型(User多對(duì)一Group)User(id,name,group)多Group(id,groupname)一Annotation配置
44、EntityTable(name=t_group)/注意表名與SQL中關(guān)鍵字重名只需要在多的一端User屬性group進(jìn)行注解配置ManyToOneJoinColumn(name=”groupId”)XML配置標(biāo)簽會(huì)在”多”的一端添加外鍵,相當(dāng)于在數(shù)據(jù)庫(kù)中添加外鍵生成的表為user(id,name,groupid),t_group(id,groupname)屬性cascade取值all,none,save-update,delete,對(duì)象間的級(jí)聯(lián)操作,只對(duì)增刪改起作用.在存儲(chǔ)時(shí)User時(shí),設(shè)置了cascade=all會(huì)自動(dòng)存儲(chǔ)相應(yīng)的t_group.而不用管user關(guān)聯(lián)的對(duì)象(通常情況下會(huì)優(yōu)先存儲(chǔ)關(guān)聯(lián)的對(duì)象,然后再存儲(chǔ)user).一對(duì)多(one to many)單向關(guān)聯(lián)映射模型(group一對(duì)多user)Group(id,name,users)一User(id,name)多設(shè)計(jì)時(shí)在一的這一端存在著多的集合,生成的數(shù)據(jù)庫(kù)表通常是在多的一端生成外鍵.Set users=new HashSet()一對(duì)多單向外鍵關(guān)聯(lián)映射在一的這一端Group端users屬性上進(jìn)行注解配置O
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報(bào)參考:教育治理視域下師德問(wèn)責(zé)制度化研究
- 課題申報(bào)參考:江南風(fēng)景攝影的審美范式及其傳統(tǒng)轉(zhuǎn)化研究
- 課題申報(bào)參考:價(jià)值醫(yī)療視角下安寧療護(hù)經(jīng)濟(jì)可持續(xù)性機(jī)理解析及促進(jìn)機(jī)制設(shè)計(jì)
- 二零二五版道路照明設(shè)施節(jié)能補(bǔ)貼申請(qǐng)合同4篇
- 2025年度大型商場(chǎng)裝修設(shè)計(jì)與施工一體化承包合同范本4篇
- 2025年金昌b2貨運(yùn)資格證多少道題
- 二零二五年度輪胎產(chǎn)品綠色環(huán)保認(rèn)證服務(wù)合同4篇
- 基于云計(jì)算的2025年度企業(yè)級(jí)應(yīng)用集成合同3篇
- 中介和房東的委托協(xié)議 2篇
- 二零二五年度商業(yè)綜合體消防安全與安保服務(wù)合同3篇
- 道路瀝青工程施工方案
- 《田口方法的導(dǎo)入》課件
- 承包鋼板水泥庫(kù)合同范本(2篇)
- 人教版(2024年新教材)七年級(jí)上冊(cè)英語(yǔ)Unit 7 Happy Birthday 單元整體教學(xué)設(shè)計(jì)(5課時(shí))
- DLT 572-2021 電力變壓器運(yùn)行規(guī)程
- 公司沒(méi)繳社保勞動(dòng)仲裁申請(qǐng)書(shū)
- 損傷力學(xué)與斷裂分析
- 2024年縣鄉(xiāng)教師選調(diào)進(jìn)城考試《教育學(xué)》題庫(kù)及完整答案(考點(diǎn)梳理)
- 車(chē)借給別人免責(zé)協(xié)議書(shū)
- 應(yīng)急預(yù)案評(píng)分標(biāo)準(zhǔn)表
- “網(wǎng)絡(luò)安全課件:高校教師網(wǎng)絡(luò)安全與信息化素養(yǎng)培訓(xùn)”
評(píng)論
0/150
提交評(píng)論