




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
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個Sl4j-nop jar3 引入mysql的JDBC驅(qū)動包4 在MYSQL中建數(shù)據(jù)庫和相應(yīng)的表student(id,name,age) 參考文檔中COPY,修改對應(yīng)的
2、數(shù)據(jù)庫連接,6 建立student類7 建立映射文件Student.hbm.xml 參考相應(yīng)文檔8 將映射文件加到hibernate-cfg.xml中搭建日志環(huán)境并配置顯示DDL語句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的接口對到log4j的實(shí)現(xiàn),在user library中hibernate,把slf的實(shí)現(xiàn)slf4j-nop-.jar去掉,添加log4j的實(shí)現(xiàn)log4j-1.2.15.jar,再添加一個slf-api和log4j轉(zhuǎn)換器
3、slf4j-log4j12-1.5.8.jar.把slf的接口轉(zhuǎn)換成log4j的接口.最后添加一個log4j的配置文件perties利用HIBERNATE導(dǎo)出數(shù)據(jù)庫建表Configuration cfg=new AnnotationConfiguration().configure();(有注解時使用AnnotationConfiguration),configure()可以手動指定配置文件名稱.Configuration cfg=new Configuration(),會默認(rèn)讀取perties文件/創(chuàng)建schemaExport對象importddl
4、.SchemaExport;SchemaExport export=new SchemaExport(cfg);/創(chuàng)建數(shù)據(jù)庫表export.create(true, true);對象映射(采用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文檔中并沒有提到hibernate-annotations.jar包4 參考annotation文檔建立對應(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();對象映射(采用配置文件方式)1 在相應(yīng)的類中建立對應(yīng)的配置文件. 例如Student類對應(yīng)的配置文件2 在hibernate.cfg.xml中添加該映射文件即可 注意包名的寫法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ù)據(jù)結(jié)構(gòu),或者將數(shù)據(jù)庫schema(表)的DDL導(dǎo)出到數(shù)據(jù)庫,使用create-drop時,在顯式關(guān)閉sessionfactory時,將drop掉數(shù)據(jù)庫schema.validate 加載hibernate時,驗(yàn)證創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu) create 每次加載hibernate,重新創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu) create-drop 加載hibernate時創(chuàng)建,退出是刪除表結(jié)構(gòu) update 加載hibernate自動更新數(shù)據(jù)庫結(jié)構(gòu)表名和類名不同的情況時,對表名進(jìn)行配置1 在注解中import javax.persistence.Table;Table(name=”
9、TableName”)2 在XML文件中 配置對應(yīng)的table屬性為相應(yīng)的表名字段名和屬性名相同,默認(rèn)為對于annotation,如果什么注解都不寫的話,相當(dāng)于加了注解Basic實(shí)體bean中所有的非static非transient的屬性都可以被持久化, 除非你將其注解為Transient.所有沒有定義注解的屬性等價于在其上面添加了Basic注解. 通過 Basic注解可以聲明屬性的獲取策略(fetch strategy):對于XML文件中不用寫column.字段名和屬性名不同時Annotation:column(name=”column_name”)加上相應(yīng)的getXXX()方法上XML:c
10、olumn屬性不需要persistence的字段import javax.persistence.Transient; Transient 意思是說這個屬性是透明的,不進(jìn)行持久化,存儲的時候不存進(jìn)去映射日期和時間類型,指定時間精度Annotation: import javax.persistence.Temporal;Temporal(TemporalType.TIME)XML:指定typetype=time或date枚舉類型的轉(zhuǎn)換Enumerated(EnumType.STRING)字段映射的位置推薦寫在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) 定長字符 string Str
12、ing VARCHAR 變長字符串 boolean boolean Boolean BIT 布爾類型 yes_no boolean Boolean CHAR(1) (Y-N) 布爾類型 true_false boolean Boolean CHAR(1) (T-F) 布爾類型 2 、 Java 時間和日期類型的 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 大對象類型的 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 在程序中通過 Hibernate 來保存 java.sql.Clob 或者 java.sql.Blob 實(shí)例時,必須包含兩個步驟: 1 在一個數(shù)據(jù)庫事務(wù)中先保存一個空的 Blob 或 Clob 實(shí)例。 2 接著鎖定這條記錄,更新上面保存的 Blob 或 Clob 實(shí)例,把二進(jìn)制數(shù)據(jù)或文本數(shù)據(jù)寫到 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方式配置可選的子元素是一個Java類的名字, 用來為該持久化類的實(shí)例生成唯一的標(biāo)識。如果這個生成器實(shí)例需要某些配置值或者初始化參數(shù), 用元素來傳遞。 uid_table next
16、_hi_value_column 所有的生成器都實(shí)現(xiàn)org.hibernate.id.IdentifierGenerator接口。 這是一個非常簡單的接口;某些應(yīng)用程序可以選擇提供他們自己特定的實(shí)現(xiàn)。當(dāng)然, Hibernate提供了很多內(nèi)置的實(shí)現(xiàn)。下面是一些內(nèi)置生成器的快捷名字: l increment 用于為long, short或者int類型生成 唯一標(biāo)識。只有在沒有其他進(jìn)程往同一張表中插入數(shù)據(jù)時才能使用。 在集群下不要使用。 l identity 對DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的內(nèi)置標(biāo)識字段提供支持。 返回的標(biāo)識符是long
17、, short 或者int類型的。 l sequence 在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的標(biāo)識符是long, short或者 int類型的。 l hilo 使用一個高/低位算法高效的生成long, short 或者 int類型的標(biāo)識符。給定一個表和字段(默認(rèn)分別是 hibernate_unique_key 和next_hi)作為高位值的來源。 高/低位算法生成的標(biāo)識符只在一個特定的數(shù)據(jù)庫中是唯一的。 l seqhilo 使用一個高/低位算法來高效的生成l
18、ong, short 或者 int類型的標(biāo)識符,給定一個數(shù)據(jù)庫序列(sequence)的名字。 l uuid 用一個128-bit的UUID算法生成字符串類型的標(biāo)識符, 這在一個網(wǎng)絡(luò)中是唯一的(使用了IP地址)。UUID被編碼為一個32位16進(jìn)制數(shù)字的字符串。 l guid 在MS SQL Server 和 MySQL 中使用數(shù)據(jù)庫生成的GUID字符串。 l native 根據(jù)底層數(shù)據(jù)庫的能力選擇identity, sequence 或者h(yuǎn)ilo中的一個。在mysql中默認(rèn)的是auto_increment,SQLSERVER中是identity.l assigned 讓應(yīng)用程序在save()之
19、前為對象分配一個標(biāo)示符。這是 元素沒有指定時的默認(rèn)生成策略。 l select 通過數(shù)據(jù)庫觸發(fā)器選擇一些唯一主鍵的行并返回主鍵值來分配一個主鍵。 l foreign 使用另外一個相關(guān)聯(lián)的對象的標(biāo)識符。通常和聯(lián)合起來使用。 l sequence-identity 一種特別的序列生成策略,使用數(shù)據(jù)庫序列來生成實(shí)際值,但將它和JDBC3的getGeneratedKeys結(jié)合在一起,使得在插入語句執(zhí)行的時候就返回生成的值。目前為止只有面向JDK 1.4的Oracle 10g驅(qū)動支持這一策略。注意,因?yàn)镺racle驅(qū)動程序的一個bug,這些插入語句的注釋被關(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中的某個屬性定義為標(biāo)識符(identifier). 該屬性的值可以通過應(yīng)用自身進(jìn)行設(shè)置, 也可以通過Hiberante生成(推薦). 使用 GeneratedValue注解可以定義該標(biāo)識符的生成策略: 有四種策略l AUTO -默認(rèn)值.可以是identity column類型,或者sequence類型或者table類型,取決于不同的底層數(shù)據(jù)庫.對于MYSQL,是auto_in
21、crement,對于Oracle是hibernate-sequence.l TABLE - 使用表保存id值 (了解)l IDENTITY - identity column l SEQUENCE - SequenceGeneratorGeneratedValue(strategy=GenerationType.XXXX)XXXX取值為Type.SEQUENCE|TABLE|AUTO|IDENTITY不同的數(shù)據(jù)庫對應(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ù)庫后sequence對象的名字.在實(shí)體中注解好后,就可以在id注解上寫上對應(yīng)的IdGeneratedValue(strategy=GenerationType.IDENTITY,generator=teacher_SEQUENCE)例3表生成器(了解),這種方式會另外生成一個表.實(shí)體類注解Entity
23、javax.persistence.TableGenerator(/了解,更適合用于跨平臺跨數(shù)據(jù)庫. 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)合主鍵生成策略一般采用這種方式,比如有一個類Student(id,name,age),為了產(chǎn)生聯(lián)合主鍵,把id和name分離出來.Student(pk,age) StudentPk(id,name)StudentPk類必需實(shí)現(xiàn)序列化接口implements.StudentPk類必需重寫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()中只有一個屬性默認(rèn)寫成IdClass(TeacherPk.Class).也就是說Teacher里面的組件屬性id,name,合起來剛好是類TeacherPk.對象的三種狀態(tài)三種狀態(tài)的區(qū)別在于:有沒有ID,ID在數(shù)據(jù)庫中有沒有,在內(nèi)存中有沒有(session緩存)三種狀態(tài)Transient:內(nèi)存中的一個對象,沒有ID,緩存中也沒有Persistent:內(nèi)存中有,緩存中有,數(shù)據(jù)庫中有IDDetached:內(nèi)存中有,緩存中沒有,數(shù)據(jù)庫有ID核心接口開發(fā)介紹Configuration1 AnnotationConfiguration2 進(jìn)
28、行配置信息的管理3 用來產(chǎn)生SessionFactory:buildSessionFactory()4 可以在configure()方法中指定hibernate配置文件SchemaExport可以在程序中控制生成建表語名.位于包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 用來產(chǎn)生和管理sesssion2 通常情況下,每個應(yīng)用只需要一個SessionFactory,除非要訪問多個數(shù)據(jù)庫的情況3 openSession()與openSession()l openSess
30、ion()總是創(chuàng)建新的session,需要手動close().l getCurrentSession()事務(wù)自動提交并且自動關(guān)閉.從上下文環(huán)境中獲得session,如果當(dāng)時環(huán)境中不存就創(chuàng)建新的.如果環(huán)境中存在就使用環(huán)境中的,而且每次得到的都是同一個session(在session提交之前,提交之后就是新的了).用途:界定事務(wù)邊界.l 所謂的上下文參見配置文件thread取值范圍 jta | thread | managed | custom.Class JTA簡介Session管理一個數(shù)據(jù)庫的任務(wù)單元,即管理數(shù)據(jù)庫中的增刪改查操作,提交事務(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 查找時,都會優(yōu)先從session的緩存中查找.l 查找不存在對應(yīng)記錄時,表現(xiàn)不一樣.load方法查找不到時不會報(bào)錯,get查找不到時會報(bào)錯.l Load返回的是代理對象,等到真正要用到對象的內(nèi)容時才發(fā)起SQL語句.get直接發(fā)起SQL語句從數(shù)據(jù)庫中取出,不會延遲.Update(
32、)方法1 用來更新detached對象,更新完成之后成為persistent.2 更新transient對象會報(bào)錯. 更新自己設(shè)定id(前提是id在數(shù)據(jù)庫中存在)的transient對象可以.3 持久化的對象只要設(shè)定不同字段就會發(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”屬性,同一個session中可以,跨session不行.跨session時的實(shí)現(xiàn)方法
33、不過可以用session的merge().merge方法會先從數(shù)據(jù)庫load,將得到的和數(shù)據(jù)庫中的進(jìn)行對比,再update更改過的字段.JPA1.0 Annotation沒有對應(yīng)的屬性,Hibernatel 使用HQL(EJBQL)(建議使用)clear()方法:清除session中的緩存.調(diào)用clear()方法會強(qiáng)制清除session緩存.不會與數(shù)據(jù)庫打交道.flush()方法:當(dāng)session的事務(wù)提交后,會強(qiáng)制進(jìn)行從內(nèi)存(session緩存)到數(shù)據(jù)庫的同步.默認(rèn)情況下是session的事務(wù)提交時才同步.不常用.Query接口關(guān)系映射這里的關(guān)系映射指的是對象之間的關(guān)系,并不是指數(shù)據(jù)庫的關(guān)系
34、. 關(guān)系映射解決的問題是,當(dāng)對象處于各種關(guān)系時,數(shù)據(jù)庫表該如何映射,編程時如何處理.一對一:單向(主鍵,外鍵),雙向(主鍵,外鍵)一對多:單向,雙向(和多對一雙向相同)多對一:單向,雙向(一對多雙向和多對一雙向是一樣的)多對多:單向,雙向(一對一單/雙向主鍵關(guān)聯(lián)映射,只作了解)集合映射:list ,map,set繼承映射(了解):單表,多表,一張主表多張子表組件映射:Embeddable,Embedded一對一(one to one) 單向關(guān)聯(lián)映射兩個對象是一對一的的關(guān)系.有兩種策略可以實(shí)現(xiàn)一對一的關(guān)聯(lián)映射l 主鍵關(guān)聯(lián):即讓兩個對象具有相同的主鍵值,以表明他們之間的一對一的對應(yīng)關(guān)系;數(shù)據(jù)庫表不
35、會有額外的字段來維護(hù)他們之間的關(guān)系,僅通過表的主鍵關(guān)系來維護(hù).一對一主鍵關(guān)聯(lián)映射默認(rèn)了級聯(lián)屬性,其關(guān)聯(lián)對象會同時存儲.所以不會拋出TransientObjectException異常.l 唯一外鍵關(guān)聯(lián):外鍵關(guān)聯(lián),本來是用于多對一的配置,但是如果加上唯一的限制之后,也可以表示一對一的關(guān)聯(lián)關(guān)系. unique=true.單向關(guān)聯(lián),如Person-person_id;加載person信息時能關(guān)聯(lián)對應(yīng)的person_id信息雙向關(guān)系,加載任何一方,都能關(guān)聯(lián)出別一方的信息.注意id的主鍵生成策略,foreign使用另外一個相關(guān)聯(lián)的對象的標(biāo)識符。通常和聯(lián)合起來使用。類Person(id,name,idCa
36、rd), 類IdCard(id,cardNo)一對一(單向)基于主鍵關(guān)聯(lián)映射(了解)XML配置方法一對一單向主鍵關(guān)聯(lián)通常使用一個特定的id生成器。 idCard one-to-one不會加載字段,它告訴HIBERNATE怎樣加載其引用對象.如何加載呢,默認(rèn)根據(jù)主鍵加載其引用對象.如在t_person中查到id=2,自動加載t_idCard中id=2的對象信息. constrained=true,表明person主鍵是個外鍵,表示當(dāng)前主鍵上存在著idCard約束,當(dāng)前主鍵id作為外鍵,參照了idCard.idCard表明person中的id來源于idCard,也就是共享idCard的主鍵.Ann
37、otation配置一對一(單向)主鍵關(guān)聯(lián)映射.(BUG)OneToOnePrimaryKeyJoinColumn有BUG,系統(tǒng)不會生成主鍵映射.推薦使用XML配置方法.一對一(單向)基于外鍵關(guān)聯(lián)映射和單向多對一關(guān)聯(lián)幾乎是一樣的。唯一不同的就是單向一對一關(guān)聯(lián)中的外鍵字段具有唯一性約束。這種方法會在表中生成一個新的外鍵字段.如果不限制外字段的唯一性約束,就會導(dǎo)致產(chǎn)生多對一的關(guān)聯(lián). 指定多的一端unique=true,這樣就限制了多的一端的多重性為一. 這種狀態(tài)注意TransientObjectException異常.在保存時就先保存外鍵idCard,再保存Person類.一對一單向外鍵關(guān)聯(lián)Anno
38、tation配置OneToOneJoinColumn(name=指定生成的外鍵字段名字)一對一(雙向)主鍵關(guān)聯(lián)映射(了解)PersonIdCard.在另一端也加上一個一對一的單向關(guān)聯(lián)映射.模型對象Person(id,name,idCard) IdCard(id,cardNo,person)中,雙方都持有對方的屬性引用.一對一(雙向)主鍵關(guān)聯(lián)映射XML配置方式在IdCard配置中建立映射,指示Hibernate如何加載,默認(rèn)情況下根據(jù)主鍵加載.也就是在基于單向一對一的映射中, 在另一端也加上一個單向一對一的主鍵關(guān)聯(lián)映射.在Person一端配置 idCard 在另一端IdCard配置 一對一(雙向
39、)主鍵關(guān)聯(lián)映射Annotation(有BUG)在兩端各自的引用屬性上加上OneToOnePrimaryKeyJoinColumn一對一(雙向)唯一外鍵關(guān)聯(lián)映射Person-IdCard.在另一端也加上一個一對一的單向關(guān)聯(lián)映射.在模型對象Person(id,name,idCard) IdCard(id,cardNo,person),雙方都持有對方的屬性引用.需要在另一端加上,指示hibernate如何加載,默認(rèn)情況下根據(jù)主鍵加載person;因?yàn)橥怄I關(guān)聯(lián)映射中,兩個實(shí)體的關(guān)系是由person的外鍵idCard來維護(hù)的,所以不能指定person的主鍵來加載person,而應(yīng)根據(jù)person的外鍵i
40、dCard來加載person對象.一對一雙向外鍵關(guān)聯(lián)映射XML配置方式Person一端:用多對一配置外鍵唯一形成一對一的配置方式. IdCard一端:一對一,引用另一端外鍵 要想加載idCard,如果不加property-ref,默認(rèn)根據(jù)person主鍵id來加載,property- ref=idCard就指示hibernate從person里面的idCard屬性來加載.一對一雙向外鍵關(guān)聯(lián)映射Annotation配置方式雙方互持對方的屬性的引用關(guān)系模型Husband(id,name,wife) Wife(id,name,husband)在Husband一端的wife屬性上注解OneToOne/
41、JoinColumn在Wife一端的husband加上注解,mappedByOneToOne(mappedBy=wife)引用屬性加上mappedBy屬性后就可以在wife這一端告知這個關(guān)聯(lián)是在wife屬性上設(shè)置的.就不用管理wife這一端生成的husband的設(shè)置.生成的wife表格不會有husband字段.規(guī)律:有雙向關(guān)聯(lián)時mappedBy通常必設(shè).聯(lián)合主鍵一對一單向外鍵關(guān)聯(lián)映射對象模型Wife(id,name,age) WifePk(id,name)Husband(id,name,wife)1 在Wife中建立聯(lián)合主鍵生成策略 IdClass(WifePk.Class) Id2 在Hus
42、band中添加個外鍵即可 OneToOne3自定義Husband中外鍵的名字 OneToOneJoinColumns(JoinColumn(name=wifeId, referencedColumnName=id),JoinColumn(name=wifeName, referencedColumnName=name)XML配置方式:略組件映射對象關(guān)系:一個對象是另一個對象的一部分?jǐn)?shù)據(jù)庫表:是一張表Annotation:Embeddable,EmbeddedXML:對象模型Husband(id,name,wife)Wife(wifeName,wifeAge)Annotation:在Husban
43、d的wife屬性上建立注解Embedded 表明該對象是從別的位置嵌入過來的,是不需要單獨(dú)映射的表.這種方式生成的表為husband(id,name,wifename,wifeage),不會生成wife表.AttributeOverride注解可以覆蓋該屬性對應(yīng)的嵌入式對象的列映射:XML: 多對一(many to one)單向關(guān)聯(lián)映射多對一的數(shù)據(jù)庫設(shè)計(jì)原則:在多的那下端加外鍵/注意在創(chuàng)建實(shí)體類屬性時應(yīng)盡量避免與SQL語句中的關(guān)鍵字重名.多對一單向關(guān)聯(lián)映射實(shí)體模型(User多對一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)簽會在”多”的一端添加外鍵,相當(dāng)于在數(shù)據(jù)庫中添加外鍵生成的表為user(id,name,groupid),t_group(id,groupname)屬性cascade取值all,none,save-update,delete,對象間的級聯(lián)操作,只對增刪改起作用.在存儲時User時,設(shè)置了cascade=all會自動存儲相應(yīng)的t_group.而不用管user關(guān)聯(lián)的對象(通常情況下會優(yōu)先存儲關(guān)聯(lián)的對象,然后再存儲user).一對多(one to many)單向關(guān)聯(lián)映射模型(group一對多user)Group(id,name,users)一User(id,name)多設(shè)計(jì)時在一的這一端存在著多的集合,生成的數(shù)據(jù)庫表通常是在多的一端生成外鍵.Set users=new HashSet()一對多單向外鍵關(guān)聯(lián)映射在一的這一端Group端users屬性上進(jìn)行注解配置O
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 西北大學(xué)《口腔醫(yī)學(xué)臨床前技能訓(xùn)練(二)》2023-2024學(xué)年第二學(xué)期期末試卷
- 浙江汽車職業(yè)技術(shù)學(xué)院《數(shù)據(jù)分析與應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 青島黃海學(xué)院《入侵檢測與入侵防御》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東勝利職業(yè)學(xué)院《供應(yīng)鏈與物流概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 甘肅省定西市漳縣2025屆五年級數(shù)學(xué)第二學(xué)期期末統(tǒng)考模擬試題含答案
- 廣東茂名健康職業(yè)學(xué)院《高等藥理學(xué)(雙語)》2023-2024學(xué)年第二學(xué)期期末試卷
- 古希臘哲學(xué)和中國哲學(xué)
- 功放高頻移相
- 公共交通服務(wù)規(guī)范管理制度
- 工程項(xiàng)目成本控制的原則
- 圍棋入門基本知識
- 2024年新疆生產(chǎn)建設(shè)兵團(tuán)興新職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測驗(yàn)歷年參考題庫(頻考版)含答案解析
- 2025年貴州蔬菜集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 醫(yī)院設(shè)施日常巡查管理制度
- 急性心房顫動中國急診管理指南(2024)解讀
- 人教版四年級下冊數(shù)學(xué)第二單元觀察物體(二) 單元測試
- 建筑工程公司績效考核制度范本
- 專題12:賓語從句 -2023年中考英語考試研究(解析版)(上海專用)
- 汽車總線系統(tǒng)檢修課件 模塊一 汽車單片機(jī)在車載網(wǎng)絡(luò)中的應(yīng)用
- 一型糖尿病的護(hù)理查房
- 《工業(yè)管道在線檢驗(yàn)指南》
評論
0/150
提交評論