超級全馬士兵hibernate學(xué)習(xí)筆記(WORD整理版)_第1頁
超級全馬士兵hibernate學(xué)習(xí)筆記(WORD整理版)_第2頁
超級全馬士兵hibernate學(xué)習(xí)筆記(WORD整理版)_第3頁
超級全馬士兵hibernate學(xué)習(xí)筆記(WORD整理版)_第4頁
超級全馬士兵hibernate學(xué)習(xí)筆記(WORD整理版)_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、課程內(nèi)容51HelloWorld52Hibernate原理模擬 - 什么是O/R Mapping以及為什么要有O/R Mapping53常見的0/R框架(了解)54hibernate基礎(chǔ)配置(重點(diǎn))55ID生成策略(重點(diǎn) AUTO)56Hibernate核心開發(fā)接口介紹(重點(diǎn))57對象的三種狀態(tài)(了解)58關(guān)系映射(重點(diǎn))59Hibernate査詢(HQL)510在Struts基礎(chǔ)上繼續(xù)完善BBS200511性能優(yōu)化(重點(diǎn))512補(bǔ)充話題5風(fēng)格51先脈絡(luò),后細(xì)節(jié)52先操作,后原理53重Annotation,輕xml配置文件5資源51http:/www. 52hiber

2、nate zh_CN文檔53hibernate annotation references5環(huán)境準(zhǔn)備51下載hibernate-distribution-3.3.2.GA-dist52下載hibernate-annotations-31.4.0.GA53注意閱讀hibernate compatibility matrix(hibernate 網(wǎng)站download)54下載slf4jl.5.86Hibernate HelloWorld61建立新java 項目,名為hibernate_0100_HelloWorld62學(xué)習(xí)建User-library-hibernate,并加入相應(yīng)的jar包63引入

3、mysql的JDBC驅(qū)動包64在mysql中建立對應(yīng)的數(shù)據(jù)庫以及表65建立hibernate 配置文件hibernate.cfg.xml66建立Student 類67建立Student 映射文件 Student.hbm.xml68將映射文件加入到hibernate.cfg.xml中69寫測試類Main,在Main中對Student對象進(jìn)行直接的存儲測試610FAQ:611Note:612建立能力7建立 Annotation 版本的 HelloWorld71創(chuàng)建teacher 表,create table teacher (id int primary key, name varhcar(20)

4、, title varchar(lO);72創(chuàng)建Teacher 類73在hibernate lib 中加入annotation的jar包74參考Annotaion文檔建立對應(yīng)的注解75在hibernate.cfg.xml中建立映射mapping class:./76參考文襠進(jìn)行測試(注意文襠中缺少configure()的小bug)77FAQ: 不給提示7What is and Why 0/R Mapping71JDBC操作數(shù)據(jù)庫很繁瑣72Sql語句編寫并不是面向?qū)ο蟮?3可以在對象和關(guān)系表之間建立關(guān)聯(lián)來簡化編程740/R Mapping 簡化編程750/R Mapping跨越數(shù)據(jù)庫平臺76Hi

5、bernate_0200_OR_Mapping_Simulation70/R Mapping Frameworks71hibernate72toplink83jdo84JPA8Hibernate基礎(chǔ)配置81對應(yīng)項目:Hibernate_0300_BasicConfiguration82介紹MSQL的圖形化客戶端83hibernate.cfg.xml: hbni2ddl.auto84搭建日志環(huán)境并配置顯示DDL語句85搭建jUnit環(huán)境86hibernate.cfg.xml:show_sql87hibernate.cfg.xml:format_sql88表名和類名不同,對表名進(jìn)行配置89字段名和

6、屬性相同810字段名和屬性名不同811不需要psersistence的字段(不用列)812映射日期與時間類型,指定時間精度813映射枚舉類型( 比較少用)914字段映射的位置(field或者get方法)915Lob916課外:CLOBBLOB類型的數(shù)據(jù)存取917課外:Hibernate自定義數(shù)據(jù)類型918hibernate 類型9ID生成策略91對應(yīng)項目:hibernate_0400_ID92注意:93xml生成id94注解方式:GeneratedValue95FAQ;106聯(lián)合主鍵10核心幵發(fā)接口介紹121hibernate_0500_CoreAPI122Hibernate API文檔需要單

7、獨(dú)下載123Configuration124SessoinFactor125Session126SchemaExport (自動建表)137Query 接口138Note:13三種對象狀態(tài)141上一個 project142三種狀態(tài)的區(qū)分關(guān)鍵在于143三種狀態(tài):144對這三種狀態(tài)需要關(guān)注的問題是在該狀態(tài)下如果進(jìn)行數(shù)據(jù)庫的操作會發(fā)生什么結(jié)果,比 如改變屬性的14關(guān)系映射(重要)15對象之間的關(guān)系151這里的關(guān)系映射指的是對象之間的關(guān)系,并不是指數(shù)據(jù)庫的關(guān)系,本章解決的問題是當(dāng)對象之間處于152簡化問題:153對一154對多155組件映射15一對一關(guān)聯(lián)161一對一單向外鍵關(guān)聯(lián)162一對一雙向外鍵關(guān)聯(lián)

8、163一對一單向主鍵關(guān)聯(lián)(不重要)174一對一雙向主鍵關(guān)聯(lián)(不重要)175聯(lián)合主鍵17組件映射171項目:hibernate_1100_component172對象關(guān)系:一個對象是另外一個對象的一部分173數(shù)據(jù)庫表:一張表174annotation: Embeddable Embbeded175xml: 使用HQL. EJBQL(JPQL 1.0) QBC(Query By Criteria) QBE(Query By Example)262總結(jié):QL應(yīng)該和導(dǎo)航關(guān)系結(jié)合,共同為査詢提供服務(wù)。26性能優(yōu)化261注意session.clear()的運(yùn)用,尤其在不斷分頁循環(huán)的時候2621+N問題 (

9、典型的面試題) (詳見hibernate_2800_Hibernate_1+N項目)263list和iterate不同之處(/主要為了面試 詳見hibernate_2900_Hibernate_list_iterate)264一級緩存和二級緩存和査詢緩存(面試題)(詳見hibernate_3000_Hibernate_3KindsOf_Cache)265事務(wù)并發(fā)處理(面試的意義更大)27課程內(nèi)容1 HelloWorlda) Xmlb) annotation2 Hibernate原理模擬 - 什么是O/R Mapping以及為什么要有O/R Mapping3 常見的0/R框架(了解)4 hibe

10、rnate基礎(chǔ)配置(重點(diǎn))5 ID生成策略(重點(diǎn) AUTO) 6 Hibernate核心開發(fā)接口介紹(重點(diǎn))7 對象的三種狀態(tài)(了解)8 關(guān)系映射(重點(diǎn))9 Hibernate査詢(HQL) 10 在Struts基礎(chǔ)上繼續(xù)完善BBS20011 性能優(yōu)化(重點(diǎn))12 補(bǔ)充話題風(fēng)格1 先脈絡(luò),后細(xì)節(jié)2 先操作,后原理3 重Annotation,輕xml配置文件a) JPA(Java Persistence API,java持久化API)b) hibernate extension資源1 http:/www. 2 hibernate zh_CN文檔3 hibernate a

11、nnotation references環(huán)境準(zhǔn)備1 下載hibernate-distribution-3.3.2.GA-dist2 下載hibernate-annotations-31.4.0.GA3 注意閱讀hibernate compatibility matrix(hibernate 網(wǎng)站download)4 下載slf4jl.5.8Hibernate HelloWorld1 建立新java 項目,名為hibernate_0100_HelloWorld2 學(xué)習(xí)建User-library-hibernate,并加入相應(yīng)的jar包a) 項目右鍵-buildpath-configure bui

12、ld path-add libraryb) 選擇User-library,在其中新建 libraray,命名為 hibernatec) 在該library中加入hibernate所需jar包i. hibernate coreii. /requirediii. slf-nop jar3 引入mysql的JDBC驅(qū)動包4 在mysql中建立對應(yīng)的數(shù)據(jù)庫以及表a) create database hibernate;b) use hibernate;c) create table Student (id int primary key, namevarchar(20), age int);5 建立h

13、ibernate 配置文件hibernate.cfg.xmla) 從參考文檔中copyb) 修改對應(yīng)的數(shù)據(jù)庫連接c) 注釋掉暫時用不上的內(nèi)容6 建立Student 類7 建立Student 映射文件 Student.hbm.xmla) 參考文檔8 將映射文件加入到hibernate.cfg.xml中a) 參考文檔9 寫測試類Main,在Main中對Student對象進(jìn)行直接的存儲測試 a) 參考文擋10 FAQ:a) 要調(diào)用 new Configuration().configure().buildSessionFactory(),而不是要省略 configure,否則會出 hibernate

14、 dialect must be set 的異常11 Note:a) 請務(wù)必建立自己動手査文擋的能力b) 重要的是:i. 要建立自己動手查一手文檔的信心ii. 還有建立自己動手查一手文檔的習(xí)慣!iii. 主動學(xué)習(xí),砍棄被動接受灌輸?shù)牧?xí)慣!12 建立能力a) 錯誤讀完整b) 讀昔誤的關(guān)鍵行c) 排除法d) 比較法e) google建立 Annotation 版本的 HelloWorld1 創(chuàng)建teacher 表,create table teacher (id int primary key, name varhcar(20), title varchar(lO);2 創(chuàng)建Teacher 類3

15、在hibernate lib 中加入annotation的jar包a) hibernate annotaion jarb) ejb3 persistence jarc) hibernate common-annotations.jard) 注意文襠中沒有提到hibernate-common-annotations.jar 文件4 參考Annotaion文檔建立對應(yīng)的注解5 在hibernate.cfg.xml中建立映射mapping class:./6 參考文襠進(jìn)行測試(注意文襠中缺少configure()的小bug)7 FAQ: 不給提示a) 配置eclipse屬性信息content ass

16、ist-activation-加上What is and Why 0/R Mapping1 JDBC操作數(shù)據(jù)庫很繁瑣2 Sql語句編寫并不是面向?qū)ο蟮? 可以在對象和關(guān)系表之間建立關(guān)聯(lián)來簡化編程4 0/R Mapping 簡化編程5 0/R Mapping跨越數(shù)據(jù)庫平臺6 Hibernate_0200_OR_Mapping_Simulation0/R Mapping Frameworks1 hibernate2 toplink3 jdo4 JPAa) 意愿統(tǒng)一天下Hibernate基礎(chǔ)配置1 對應(yīng)項目:Hibernate_0300_BasicConfiguration2 介紹MSQL的圖形化客

17、戶端3 hibernate.cfg.xml: hbni2ddl.auto:create、update。a) 先建表還是先建實體類先建表4 搭建日志環(huán)境并配置顯示DDL語句a) slf4j與log4j的關(guān)系:slf4j像是一個大管家,可以管理許多的日志框架,log4j是其中之一b) 加入slf4j-log4j.jar,加入 log4j 的 jar 包,去掉 slf4-nop.jarc) 從hibernate/project/etc 目錄 copy pertiesd) 査詢hibernate文襠,日志部分,調(diào)整日志的輸出策略5 搭建jUnit環(huán)境a) 需要注意jUnit的Bug6

18、 hibernate.cfg.xml:show_sql 是否輸出SQL語句7 hibernate.cfg.xml:format_sql格式化SQL語句,美化SQL語句 true8 表名和類名不同,對表名進(jìn)行配置a) Annotation: Tableb) xml:自己査詢9 字段名和屬性相同a) 不用寫column 與默認(rèn)的Basic效果一樣b) Xml中不用寫 column10 字段名和屬性名不同a) Annotation: Columnb) xml:自己査詢11 不需要psersistence的字段(不用列)a) Annotation:Transient定義不寫入數(shù)據(jù)庫,屬性透明b) xm

19、l不寫12 映射日期與時間類型,指定時間精度a) Annotation:Temporal(參數(shù)) 參數(shù)有3種 只顯示時間,只顯示日期,時間日期都顯示/Temporal(TemporalType.DATE) 只顯示日期/Temporal(TemporalType.TIME) 只顯示時間/Temporal(TemporalType.TIMESTAMP) 顯示日期與時間b) xml:指定 type13 映射枚舉類型( 比較少用)a) EnumeratedEnumerated(EnumType.ORDINAL) 枚舉類型按位置數(shù),如:0,1,2 .存儲Enumerated(EnumType.STRIN

20、G) 枚舉類型按設(shè)定值存儲b) xml:麻煩14 字段映射的位置(field或者get方法)a) best practice:保持 field(變量定義) 和 get set 方法的一致15 Lob16 課外:CLOBBLOB類型的數(shù)據(jù)存取17 課外:Hibernate自定義數(shù)據(jù)類型18 hibernate 類型ID生成策略1 對應(yīng)項目:hibernate_0400_ID2 注意:a) 我們觀察hibernate生成表的結(jié)構(gòu)并不是為了將來就用它生成,(可能還有自己的擴(kuò)展,比如index等)而是為了明白我們應(yīng)該建立什么樣的表和實體類映射3 xml生成ida) generatorb) 常用四個:n

21、ative identity sequence uuidc) uuid:用一個128位的uuid算法生成字符串類型的標(biāo)識符,這在一個網(wǎng)絡(luò)中是唯一的(IP地址也作為算法的數(shù)據(jù)源)。UUID被編碼為一個32位十六進(jìn)制的字符串4 注解方式:GeneratedValuea) 自定義IDb) AUTO(直接寫 GeneratedValue 相當(dāng)如native) (GeneratedValue(strategy=GenerationType.AUTO)i. 默認(rèn):對 MySQL,使用auto_incrementii. 對 Oracle使用hibernate_sequence(名稱固定)c) IDENTIT

22、Y(GeneratedValue(strategy=GenerationType.IDENTITY)d) SEQUENCE(GeneratedValue(strategy=GenerationType.SEQUENCE)i. SequenceGenerator(可自定義在數(shù)據(jù)庫生成指定的sequence名) Id/在GeneratedValue中增加 generator=teacherSEQGeneratedValue(strategy=GenerationType.SEQUENCE,generator=teacherSEQ)/teacherSEQ為SequenceGenerator的標(biāo)識名/

23、teacherSEQ_DB為指定到數(shù)據(jù)庫生成的Sequence名SequenceGenerator(name=teacherSEQ, sequenceName=teacherSEQ_DB) public int getId() return id;e) TABLE (可以忘記)i. TableGeneratorTableGenerator(name=teacherID,/被調(diào)用的TABLE名字table=teacherID_DB,/數(shù)據(jù)庫建立的表名pkColumnName=key_value,pkColumnValue=pk_value,valueColumnName=teacher,/pkC

24、olumnValue對應(yīng)類名allocationSize=1/pkColumnValue對應(yīng)類名)GeneratedValue(strategy=GenerationType.TABLE,generator= teacherID )注:如果使用注解方式的uuid 如下:IdGeneratedValue(generator=teacherUUID)GenericGenerator(name=teacherUUID, strategy=uuid)5 FAQ;a) 用Junit測試時Hibernate Session Factory初始化異常不提示.疑似一個bugb) 用main來做測試6 聯(lián)合主鍵

25、a) Xml方式: composite-idi. 將聯(lián)合主鍵的屬性提取出來,重新編寫一個pojo類(原pojo類中的id,name要刪除 并新加入屬性“StudentPK”) public class StudentPK implements Serializable private String id;private String name; ii. 新建pojo類必須實現(xiàn) java.io.Serializable 序列化接口iii. 新pojo類要重寫equals和hashCode方法Overridepublic boolean equals(Object o) if(o instance

26、of StudentPk) StudentPk pk = (StudentPk)o;if(this.id = pk.getId() & .equals(pk.getName() return true;return false;Overridepublic int hashCode() return .hashCode();iv. 聯(lián)合主鍵生成策略XML配置方法 b) Annotationi. 前三步與Xml方式前三步一樣 都要建立新pojo類 都要實現(xiàn)Serializable接口 重寫equals和hashCode方法.ii. 方法1在新類前寫Embedd

27、able,在原pojo類的新屬性“TercherPK”的get方法前寫ld,如下 Embeddablepublic class TeacherPK implements Serializable private String id;private String name; Entitypublic class Teacher private TeacherPK teacherPK ;Idpublic TeacherPK getTeacherPK() return teacherPK; iii. 方法2:EmbeddedlD(*) 新pojo類無需加注解,只需在原pojo類新屬性“Tercher

28、PK”的get方法前寫EmbeddedlD即可iv. 方法3:Id IdClass(*) 新pojo類無需加注解,原pojo類的id,name屬性保留不變,也無需新增“TercherPK”屬性。 只在id,name的get方法前都加Id,并在原pojo類前加“IdClass(TeacherPK).class)”,如下EntityIdClass(TeacherPK.class)public class Teacher private String id;private String name;Idpublic String getId() return id;Idpublic String ge

29、tName() return name;. .核心幵發(fā)接口介紹1 hibernate_0500_CoreAPI2 Hibernate API文檔需要單獨(dú)下載3 Configurationa) AnnotationConfigurationb) 進(jìn)行配置信息的管理c) 用來產(chǎn)生SessionFactoryd) 可以在configure方法中指定hibernate配置文件e) 只去關(guān)注一個方法即:buildSessionFactory4 SessoinFactora) 用來產(chǎn)生和管理Sessionb) 通常情況下每個應(yīng)用只需要一個SessionFactoryc) 除非要訪間多個數(shù)據(jù)庫的情況d) 關(guān)

30、注兩個方法即:openSession getCurrentsessioni. open session每次都是新的,需要closeii. getCurrentsession從上下文找,如果有,用舊的,如果沒有,建新的1. 用途,界定事務(wù)邊界2. 事務(wù)提交自動close3. 上下文配置可參見xml文件中 thread4. current_session_context_class (jta、thread常用 managed、custom.Class少用) a) thread 使用connection 但數(shù)據(jù)庫連接管理事務(wù)b)jta (全稱java transaction api)-java分布式

31、事務(wù)管理(多數(shù)據(jù)庫訪問)jta由中間件提供(jboss WebLogic等,tomcat不支持)5 Sessiona) 管理一個數(shù)據(jù)庫的任務(wù)單元(簡單說就是增 刪 改 查)b) 方法(CRUD)i. Save()session.save(對象);ii. Deletesession.delete(對象);iii. LoadStudent s1=(Student)session.load(Student.class, 1);iv. GetStudent s1=(Student)session.get(Student.class, 1);v. get與load的區(qū)別(面試重點(diǎn),原理)1. 不存在對應(yīng)

32、記錄時表現(xiàn)不一樣2. load返回的是代理對象,等到真正用到對象的內(nèi)容時才發(fā)出sql語句3. get直接從數(shù)據(jù)庫加載,不會延遲vi. updatessession.update(對象);1. 用來更新detached對象,更新完成后轉(zhuǎn)為persistent狀態(tài)2. 更新transient對象會報錯3. 更新自己設(shè)定id的transient對象可以(數(shù)據(jù)庫有對應(yīng)記錄)4. persistent狀態(tài)的對象只要設(shè)定(如:t.setName)不同字段就會發(fā)生更新5. 更新部分更改的字段a) xml 設(shè)定 property 標(biāo)簽的 update 屬性,annotation 設(shè)定Column 的 upda

33、table屬性,不過這種方式很少用,因為不靈活(忘記)b) 使用xml中的dynamic-update,JPA1.0 Annotation 沒有對應(yīng)的屬性,hibernate 擴(kuò)展? i. 同一個session可以,跨session不行,不過可以用merge()(不重要)c) 使用 HQL(EjBQL)(建議)vii. saveOrUpdate()session.saveOrUpdate(對象);viii. clear方法session.clear();1.無論是load還是get,都會首先査找緩存(一級緩存),如果沒有,才會去數(shù)據(jù)庫査找,調(diào)用clear()方法可以強(qiáng)制清除session緩存i

34、x. flush()方法session.flush();1. 當(dāng)session的事務(wù)提交后,會強(qiáng)制將內(nèi)存(session緩存)與數(shù)據(jù)庫同步.默認(rèn)情況下是session的事務(wù)提交(commit)時才同步!2. session的FlushMode設(shè)置,可以設(shè)定在什么時候同步緩存與數(shù)據(jù)庫(很少用)例如: session.setFlushMode(FlushMode.AUTO)x. find方法已經(jīng)過時!6 SchemaExport (自動建表)new SchemaExport(new AnnotationConfiguration().configure().create(false, true);

35、7 Query 接口a) 參考Hibernate査詢(HQLEJBQL)的內(nèi)容8 Note:a) Hibernate中涉及很多非常非常細(xì)節(jié)的區(qū)別,但在實際應(yīng)用中用得極少,請大家先享受寫項目的樂趣,再來探討這些細(xì)節(jié)問題i. 比如save和persist的區(qū)別ii. merge、evict 等方法iii. 比如 refresh、lock 等b) 建議的學(xué)習(xí)方法,動手實驗c) 細(xì)節(jié)問題參考補(bǔ)充視頻三種對象狀態(tài)1 上一個 project2 三種狀態(tài)的區(qū)分關(guān)鍵在于a) 有沒有IDb) ID在數(shù)據(jù)庫中有沒有c) 在內(nèi)存中有沒有(session緩存)3 三種狀態(tài):a) transient:內(nèi)存中一個對象,沒

36、ID,緩存中也沒有b) persistent:內(nèi)存中有,緩存中有,數(shù)據(jù)庫有(ID) c) detached:內(nèi)存有,緩存沒有,數(shù)據(jù)庫有,ID4 對這三種狀態(tài)需要關(guān)注的問題是在該狀態(tài)下如果進(jìn)行數(shù)據(jù)庫的操作會發(fā)生什么結(jié)果,比 如改變屬性的值會不會發(fā)出update語句?a) 強(qiáng)烈建議動手實驗b) 進(jìn)行正常人的思考c) 絕對不要去背這些東西!背過也并不代表你有多牛!關(guān)系映射(重要)對象之間的關(guān)系1 這里的關(guān)系映射指的是對象之間的關(guān)系,并不是指數(shù)據(jù)庫的關(guān)系,本章解決的問題是當(dāng)對象之間處于下列關(guān)系之一時,數(shù)據(jù)庫表該如何映射,編程上該如何對待(紅色為重點(diǎn)中的重點(diǎn))2 簡化問題:a) 怎么寫Annotatio

37、nb) 增刪改査CRUD怎么寫3 對一:在數(shù)據(jù)庫當(dāng)中設(shè)計為單向主鍵關(guān)聯(lián)和單向外鍵關(guān)聯(lián)a) 單向(主鍵、外鍵)b) 雙向(主鍵、外鍵)c) 中間表 用的太少了4 對多a) 單向b) 雙向5 多對一a) 單向b) 雙向6 多對多a) 單向b) 雙向 (加起來總共七種,其實一對多和多對一的雙向是一回事)7 集合映射a) Listb) Setc) Map8 繼承關(guān)系(不重要)a) 單表b) 多表c) 一張主表d) 多張子表9 組件映射a) Embeddableb) Embedded一對一關(guān)聯(lián)1 一對一單向外鍵關(guān)聯(lián)a) 項目名稱:hibernate_0600_one2one_uni_fkb) Annot

38、ation: 在被約束表字段的get方法上加0ne20ne JoinColumnOneToOne(optional = false)/給外鍵增加唯一約束JoinColumn(name=wifeid) /指定生成的數(shù)據(jù)庫字段名public Wife getWife() return wife;c) xml: 在被約束表的xml配置文件中加many-to-one uniqueunique=true是保證生成的字段唯一,這樣many-to-one 也達(dá)到了一對一的效果2 一對一雙向外鍵關(guān)聯(lián)a) 項目名稱:hibernate_0700_one2one_bi_fkb) Annotation: 0ne20

39、ne(mappedBy=”另一個類里定義的屬性名”)規(guī)律:凡是雙向關(guān)聯(lián),必設(shè)mappedBy 在Wife類中 寫Husband對象屬性 并添加注解OneToOne(mappedBy=wife) mappedBy作用是指定這個一對一關(guān)聯(lián)是被Husband類的 wife屬性(準(zhǔn)確說是getWife方法)做的映射OneToOne(mappedBy=wife) public Husband getHusband() return husband;在 類中寫Wife對象屬性O(shè)neToOneJoinColumn(name=wifeid) /指定生成的數(shù)據(jù)庫字段名public Wife getWife()

40、return wife;此注釋將由Husband表中生成wifeid字段作為fk外鍵,wife表中不生成額外的Husbandid字段c) xml: many-to-one unique one-to-one property-ref在Student類中寫StuIdCard屬性, StuIdCard類中寫Student屬性StuIdCard.hbm.xml文件中加Student.hbm.xml文件中加其中, property-ref 相當(dāng)于mappedBy此方式生成的StuIdCard表中包含studentid字段作為fk外鍵, Student表中不生成額外的字段特別說明: 一對一單向外鍵關(guān)聯(lián)與

41、一對一雙向外鍵關(guān)聯(lián)在數(shù)據(jù)庫的表的格式是一樣的,區(qū)別在于java程序中. 雙向外鍵關(guān)聯(lián)可通過Hibernate在兩個類間互相調(diào)用彼此,而單向外鍵關(guān)聯(lián)只能單方向調(diào)用.3 一對一單向主鍵關(guān)聯(lián)(不重要,忘記)a) 項目名稱:hibernate_0800_one2one_uni_pkb) primaryKeyJoinColumnc) xml: one-to-one id 使用 foreign class4 一對一雙向主鍵關(guān)聯(lián)(不重要,忘記)a) 項目名稱:hibernate_0900_one2one_bi_pkb) primaryKeyJoinColumn(不常用,了解)c) xml: one-to-o

42、ne id 使用foreign class和one-to-one property-ref5 聯(lián)合主鍵a) 項目名稱:hibernate_1000_one2one_uni_fk_compositeb) JoinColumnsWife類中建立聯(lián)合主鍵,建立方式參考 ID生成策略中的聯(lián)合主鍵部分Husband類中寫Wife對象屬性,并在其get方法上寫OneToOne即可完成一對一外鍵映射若想要指定生成的外鍵名 則需使用JoinColumns注解,如下:OneToOneJoinColumns( JoinColumn(name = wifeid, referencedColumnName = id)

43、,JoinColumn(name = wifename, referencedColumnName = name) )/*JoinColumns用于在一對一外鍵關(guān)聯(lián)存在聯(lián)合主鍵情況時指定生成的外鍵字段名稱JoinColumns的參數(shù)為JoinColumn數(shù)組 JoinColumn內(nèi)除需指定name屬性外還需指定 referencedColumnName屬性值 作用是可指定生成的字段名所對應(yīng)的目標(biāo)表字段名*/public Wife getWife() 組件映射1 項目:hibernate_1100_component2 對象關(guān)系:一個對象是另外一個對象的一部分3 數(shù)據(jù)庫表:一張表4 annota

44、tion: Embeddable Embbeded 對象模型Husband(id,name,wife)Wife(name,age)Annotation:在Husband的wife屬性上建立注解Embedded 表明該對象是從別的位置嵌入過來的,是不需要單獨(dú)映射的表.這種方式生成的表為husband(id,name,wifename,wifeage),不會生成wife表.EmbeddedPublic Wift getWife()AttributeOverride注解需要寫在getWife方法上,可以重新指定生成的Wife類組件生成的字段名,例如:Husband與Wife兩個類中都有name字段,

45、這樣在生成表的時候會有沖突,此時采用AttributeOverride注解可以指定Wife類中的name屬性對應(yīng)新的字段名“wifename”,不過AttributeOverride注解不常用,因為有更好的解決方法. 1:不要在組件的兩個映射類中寫同名屬性;2:如果真的有重復(fù),那么可以在分類中(此處為Wife類)的重復(fù)名稱的屬性上使用如下內(nèi)容以指定新的字段名:Column(name=wifename)public String getName() return name;另外, Embeddable注解好像是寫在分類(Wife類)的類名前的,不過好像不寫也行Embeddablepublic class Wife 5 xml: 使用component,例如: 多對一與一對多1 多對一單向關(guān)聯(lián)a) 項目名稱:hibernate_1200_many2one_uni實體模型(User多對一Group)User(id,name,group)多Group(id,name)一b

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論