馬士兵hibernate學(xué)習(xí)筆記(原版)-你信不信,我反正是信了_第1頁
馬士兵hibernate學(xué)習(xí)筆記(原版)-你信不信,我反正是信了_第2頁
馬士兵hibernate學(xué)習(xí)筆記(原版)-你信不信,我反正是信了_第3頁
馬士兵hibernate學(xué)習(xí)筆記(原版)-你信不信,我反正是信了_第4頁
馬士兵hibernate學(xué)習(xí)筆記(原版)-你信不信,我反正是信了_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、馬士兵hibernate學(xué)習(xí)筆記課程內(nèi)容61HelloWorld62Hibernate原理模擬 - 什么是O/R Mapping以及為什么要有O/R Mapping63常見的0/R框架(了解)64hibernate基礎(chǔ)配置(重點)65ID生成策略(重點 AUTO)66Hibernate核心開發(fā)接口介紹(重點)67對象的三種狀態(tài)(了解)68關(guān)系映射(重點)69Hibernate査詢(HQL)610在Struts基礎(chǔ)上繼續(xù)完善BBS200611性能優(yōu)化(重點)612補充話題6風(fēng)格61先脈絡(luò),后細(xì)節(jié)62先操作,后原理63重Annotation,輕xml配置文件6資源61http:/www. hibe

2、62hibernate zh_CN文檔63hibernate annotation references6環(huán)境準(zhǔn)備61下載62下載63注意閱讀hibernate compatibility matrix(hibernate 網(wǎng)站download)64下載7Hibernate HelloWorld71建立新java 項目,名為hibernate_0100_HelloWorld72學(xué)習(xí)建User-library-hibernate,并加入相應(yīng)的jar包73引入mysql的JDBC驅(qū)動包74在mysql中建立對應(yīng)的數(shù)據(jù)庫以及表75建立hibernate 配置文件76建立Studen

3、t 類77建立Student 映射文件78將映射文件加入到中79寫測試類Main,在Main中對Student對象進行直接的存儲測試710FAQ:711Note:712建立能力8建立 Annotation 版本的 HelloWorld81創(chuàng)建teacher 表,create table teacher (id int primary key, name varhcar(20), title varchar(lO);82創(chuàng)建Teacher 類83在hibernate lib 中加入annotation的jar包84參考Annotaion文檔建立對應(yīng)的注解85在中建立映射mapping class

4、:./86參考文襠進行測試(注意文襠中缺少configure()的小bug)87FAQ: 不給提示8What is and Why 0/R Mapping81JDBC操作數(shù)據(jù)庫很繁瑣82Sql語句編寫并不是面向?qū)ο蟮?3可以在對象和關(guān)系表之間建立關(guān)聯(lián)來簡化編程840/R Mapping 簡化編程850/R Mapping跨越數(shù)據(jù)庫平臺86Hibernate_0200_OR_Mapping_Simulation80/R Mapping Frameworks81hibernate82toplink93jdo94JPA9Hibernate基礎(chǔ)配置91對應(yīng)項目:Hibernate_0300_Basic

5、Configuration92介紹MSQL的圖形化客戶端9394搭建日志環(huán)境并配置顯示DDL語句95搭建jUnit環(huán)境96:show_sql97:format_sql98表名和類名不同,對表名進行配置99字段名和屬性相同910字段名和屬性名不同911不需要psersistence的字段(不用列)912映射日期與時間類型,指定時間精度913映射枚舉類型( 比較少用)1014字段映射的位置(field或者get方法)1015Lob1016課外:CLOBBLOB類型的數(shù)據(jù)存取1017課外:Hibernate自定義數(shù)據(jù)類型1018hibernate 類型10ID生成策略101對應(yīng)項目:hibernat

6、e_0400_ID102注意:103xml生成id104注解方式:GeneratedValue105FAQ;116聯(lián)合主鍵11核心幵發(fā)接口介紹131hibernate_0500_CoreAPI132Hibernate API文檔需要單獨下載133Configuration134SessoinFactor135Session136SchemaExport (自動建表)147Query 接口148Note:14三種對象狀態(tài)151上一個 project152三種狀態(tài)的區(qū)分關(guān)鍵在于153三種狀態(tài):154對這三種狀態(tài)需要關(guān)注的問題是在該狀態(tài)下如果進行數(shù)據(jù)庫的操作會發(fā)生什么結(jié)果,比 如改變屬性的15關(guān)系映

7、射(重要)16對象之間的關(guān)系161這里的關(guān)系映射指的是對象之間的關(guān)系,并不是指數(shù)據(jù)庫的關(guān)系,本章解決的問題是當(dāng)對象之間處于162簡化問題:163對一164對多165組件映射16一對一關(guān)聯(lián)171一對一單向外鍵關(guān)聯(lián)172一對一雙向外鍵關(guān)聯(lián)173一對一單向主鍵關(guān)聯(lián)(不重要)184一對一雙向主鍵關(guān)聯(lián)(不重要)185聯(lián)合主鍵18組件映射181項目:hibernate_1100_component182對象關(guān)系:一個對象是另外一個對象的一部分183數(shù)據(jù)庫表:一張表184annotation: Embeddable Embbeded185xml: 使用HQL. EJBQL(JPQL 1.0) QBC(Que

8、ry By Criteria) QBE(Query By Example)272總結(jié):QL應(yīng)該和導(dǎo)航關(guān)系結(jié)合,共同為査詢提供服務(wù)。27性能優(yōu)化271注意session.clear()的運用,尤其在不斷分頁循環(huán)的時候2721+N問題 (典型的面試題) (詳見hibernate_2800_Hibernate_1+N項目)273list和iterate不同之處(/主要為了面試 詳見hibernate_2900_Hibernate_list_iterate)274一級緩存和二級緩存和査詢緩存(面試題)(詳見hibernate_3000_Hibernate_3KindsOf_Cache)275事務(wù)并發(fā)處

9、理(面試的意義更大)28課程內(nèi)容1 HelloWorlda) Xmlb) annotation2 Hibernate原理模擬 - 什么是O/R Mapping以及為什么要有O/R Mapping3 常見的0/R框架(了解)4 hibernate基礎(chǔ)配置(重點)5 ID生成策略(重點 AUTO) 6 Hibernate核心開發(fā)接口介紹(重點)7 對象的三種狀態(tài)(了解)8 關(guān)系映射(重點)9 Hibernate査詢(HQL) 10 在Struts基礎(chǔ)上繼續(xù)完善BBS20011 性能優(yōu)化(重點)12 補充話題風(fēng)格1 先脈絡(luò),后細(xì)節(jié)2 先操作,后原理3 重Annotation,輕xml配置文件a) J

10、PAb) hibernate extension資源1 http:/www. 2 hibernate zh_CN文檔3 hibernate annotation references環(huán)境準(zhǔn)備1 下載2 下載3 注意閱讀hibernate compatibility matrix(hibernate 網(wǎng)站download)4 下載Hibernate HelloWorld1 建立新java 項目,名為hibernate_0100_HelloWorld2 學(xué)習(xí)建User-library-hibernate,并加入相應(yīng)的jar包a) 項目右鍵-buildpath-config

11、ure build 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

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

13、1 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 在hibernate lib 中加入annotat

14、ion的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 參考文襠進行測試(注意文襠中缺少configure()的小bug)7 FAQ: 不給提示a) 配置eclipse屬性信息content assist-activation-加上What is

15、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的圖形化客戶端3 :create、update。a) 先建表

16、還是先建實體類先建表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 :show_sql 是否輸出SQL語句7 :format_sql格式化SQL語句,美化SQL語句 true8 表

17、名和類名不同,對表名進行配置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) xml不寫12 映射日期與時間類型,指定時間精度a) Annotation:Temporal(參數(shù)) 參數(shù)有3種 只顯示時間,只顯示日期,時間日期都顯示/Temporal(Tempora

18、lType.DATE) 只顯示日期/Temporal(TemporalType.TIME) 只顯示時間/Temporal(TemporalType.TIMESTAMP) 顯示日期與時間b) xml:指定 type13 映射枚舉類型( 比較少用)a) EnumeratedEnumerated(EnumType.ORDINAL) 枚舉類型按位置數(shù),如:0,1,2 .存儲Enumerated(EnumType.STRING) 枚舉類型按設(shè)定值存儲b) xml:麻煩14 字段映射的位置(field或者get方法)a) best practice:保持 field(變量定義) 和 get set 方法的

19、一致15 Lob16 課外:CLOBBLOB類型的數(shù)據(jù)存取17 課外:Hibernate自定義數(shù)據(jù)類型18 hibernate 類型ID生成策略1 對應(yīng)項目:hibernate_0400_ID2 注意:a) 我們觀察hibernate生成表的結(jié)構(gòu)并不是為了將來就用它生成,(可能還有自己的擴展,比如index等)而是為了明白我們應(yīng)該建立什么樣的表和實體類映射3 xml生成ida) generatorb) 常用四個:native identity sequence uuid4 注解方式:GeneratedValuea) 自定義IDb) AUTO(直接寫 GeneratedValue 相當(dāng)如nati

20、ve) (GeneratedValue(strategy=GenerationType.AUTO)i. 默認(rèn):對 MySQL,使用auto_incrementii. 對 Oracle使用hibernate_sequence(名稱固定)c) IDENTITY(GeneratedValue(strategy=GenerationType.IDENTITY)d) SEQUENCE(GeneratedValue(strategy=GenerationType.SEQUENCE)i. SequenceGenerator(可自定義在數(shù)據(jù)庫生成指定的sequence名) Id/在GeneratedValue

21、中增加 generator=teacherSEQGeneratedValue(strategy=GenerationType.SEQUENCE,generator=teacherSEQ)/teacherSEQ為SequenceGenerator的標(biāo)識名/teacherSEQ_DB為指定到數(shù)據(jù)庫生成的Sequence名SequenceGenerator(name=teacherSEQ, sequenceName=teacherSEQ_DB) public int getId() return id;e) TABLE (可以忘記)i. TableGeneratorTableGenerator(na

22、me=teacherID,/被調(diào)用的TABLE名字table=teacherID_DB,/數(shù)據(jù)庫建立的表名pkColumnName=key_value,pkColumnValue=pk_value,valueColumnName=teacher,/pkColumnValue對應(yīng)類名allocationSize=1/pkColumnValue對應(yīng)類名)GeneratedValue(strategy=GenerationType.TABLE,generator= teacherID )注:如果使用注解方式的uuid 如下:IdGeneratedValue(generator=teacherUUID

23、)GenericGenerator(name=teacherUUID, strategy=uuid)5 FAQ;a) 用Junit測試時Hibernate Session Factory初始化異常不提示.疑似一個bugb) 用main來做測試6 聯(lián)合主鍵a) Xml方式: composite-idi. 將聯(lián)合主鍵的屬性提取出來,重新編寫一個pojo類(原pojo類中的id,name要刪除 并新加入屬性“StudentPK”) public class StudentPK implements Serializable private String id;private String name;

24、 ii. 新建pojo類必須實現(xiàn) java.io.Serializable 序列化接口iii. 新pojo類要重寫equals和hashCode方法Overridepublic boolean equals(Object o) if(o instanceof StudentPk) StudentPk pk = (StudentPk)o; return true;return false;Overridepublic int hashCode() iv. 聯(lián)合主鍵生成策略XML配置方法 b) Annotationi. 前三步與Xml方式前三步一樣 都要建立新pojo類 都要實現(xiàn)Serializa

25、ble接口 重寫equals和hashCode方法.ii. 方法1在新類前寫Embeddable,在原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:Em

26、beddedlD(*) 新pojo類無需加注解,只需在原pojo類新屬性“TercherPK”的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

27、 String getId() return id;Idpublic String getName() return name;. .核心幵發(fā)接口介紹1 hibernate_0500_CoreAPI2 Hibernate API文檔需要單獨下載3 Configurationa) AnnotationConfigurationb) 進行配置信息的管理c) 用來產(chǎn)生SessionFactoryd) 可以在configure方法中指定hibernate配置文件e) 只氣關(guān)注一個方法即:buildSessionFactory4 SessoinFactora) 用來產(chǎn)生和管理Sessionb) 通常情況

28、下每個應(yīng)用只需要一個SessionFactoryc) 除非要訪間多個數(shù)據(jù)庫的情況d) 關(guān)注兩個方法即: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ù)庫

29、連接管理事務(wù)b)jta (全稱java transaction api)-java分布式事務(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(Stude

30、nt.class, 1);v. get與load的區(qū)別(面試重點,原理)1. 不存在對應(yīng)記錄時表現(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è)定 prope

31、rty 標(biāo)簽的 update 屬性,annotation 設(shè)定Column 的 updatable屬性,不過這種方式很少用,因為不靈活(忘記)b) 使用xml中的dynamic-update,JPA1.0 Annotation 沒有對應(yīng)的屬性,hibernate 擴展? i. 同一個session可以,跨session不行,不過可以用merge()(不重要)c) 使用 HQL(EjBQL)(建議)vii. saveOrUpdate()session.saveOrUpdate(對象);viii. clear方法session.clear();1.無論是load還是get,都會首先査找緩存(一級緩

32、存),如果沒有,才會去數(shù)據(jù)庫査找,調(diào)用clear()方法可以強制清除session緩存ix. flush()方法session.flush();1. 當(dāng)session的事務(wù)提交后,會強制將內(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 AnnotationConf

33、iguration().configure().create(false, true);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é)問題參考補充視頻三種對象狀態(tài)1 上一個 project2 三種狀態(tài)的區(qū)分關(guān)鍵在于a) 有沒有IDb) ID在數(shù)據(jù)庫中有沒有c) 在內(nèi)存

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

35、映射,編程上該如何對待(紅色為重點中的重點)2 簡化問題:a) 怎么寫Annotationb) 增刪改査CRUD怎么寫3 對一a) 單向(主鍵、外鍵)b) 雙向(主鍵、外鍵)c) 中間表4 對多a) 一張主表,多張子表5 組件映射a) Embeddableb) Embedded一對一關(guān)聯(lián)1 一對一單向外鍵關(guān)聯(lián)a) 項目名稱:hibernate_0600_one2one_uni_fkb) Annotation: 在被約束表字段的get方法上加0ne20ne JoinColumnOneToOneJoinColumn(name=wifeid) /指定生成的數(shù)據(jù)庫字段名public Wife getW

36、ife() 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: 0ne20ne(mappedBy=”另一個類里定義的屬性名”)規(guī)律:凡是雙向關(guān)聯(lián),必設(shè)mappedBy 在Wife類中 寫Husband對象屬性 并添加注解OneToOne(mappedBy=wife) mappedBy作用是指定這個一對一關(guān)聯(lián)是被Husband類的

37、 wife屬性(準(zhǔn)確說是getWife方法)做的映射OneToOne(mappedBy=wife) public Husband getHusband() return husband;在 類中寫Wife對象屬性O(shè)neToOneJoinColumn(name=wifeid) /指定生成的數(shù)據(jù)庫字段名public Wife getWife() return wife;此注釋將由Husband表中生成wifeid字段作為fk外鍵,wife表中不生成額外的Husbandid字段c) xml: many-to-one unique one-to-one property-ref在Student類中寫S

38、tuIdCard屬性, StuIdCard類中寫Student屬性文件中加文件中加其中, property-ref 相當(dāng)于mappedBy此方式生成的StuIdCard表中包含studentid字段作為fk外鍵, Student表中不生成額外的字段特別說明: 一對一單向外鍵關(guān)聯(lián)與一對一雙向外鍵關(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) primaryKeyJoinColumn

39、c) xml: one-to-one id 使用 foreign class4 一對一雙向主鍵關(guān)聯(lián)(不重要,忘記)a) 項目名稱:hibernate_0900_one2one_bi_pkb) primaryKeyJoinColumn(不常用,了解)c) xml: one-to-one 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

40、對象屬性,并在其get方法上寫OneToOne即可完成一對一外鍵映射若想要指定生成的外鍵名 則需使用JoinColumns注解,如下:OneToOneJoinColumns( JoinColumn(name = wifeid, referencedColumnName = id),JoinColumn(name = wifename, referencedColumnName = name) )/*JoinColumns用于在一對一外鍵關(guān)聯(lián)存在聯(lián)合主鍵情況時指定生成的外鍵字段名稱JoinColumns的參數(shù)為JoinColumn數(shù)組 JoinColumn內(nèi)除需指定name屬性外還需指定 ref

41、erencedColumnName屬性值 作用是可指定生成的字段名所對應(yīng)的目標(biāo)表字段名*/public Wife getWife() 組件映射1 項目:hibernate_1100_component2 對象關(guān)系:一個對象是另外一個對象的一部分3 數(shù)據(jù)庫表:一張表4 annotation: Embeddable Embbeded 對象模型Husband(id,name,wife)Wife(name,age)Annotation:在Husband的wife屬性上建立注解Embedded 表明該對象是從別的位置嵌入過來的,是不需要單獨映射的表.這種方式生成的表為husband(id,name,wi

42、fename,wifeage),不會生成wife表.EmbeddedPublic Wift getWife()AttributeOverride注解需要寫在getWife方法上,可以重新指定生成的Wife類組件生成的字段名,例如:Husband與Wife兩個類中都有name字段,這樣在生成表的時候會有沖突,此時采用AttributeOverride注解可以指定Wife類中的name屬性對應(yīng)新的字段名“wifename”,不過AttributeOverride注解不常用,因為有更好的解決方法. 1:不要在組件的兩個映射類中寫同名屬性;2:如果真的有重復(fù),那么可以在分類中(此處為Wife類)的重復(fù)

43、名稱的屬性上使用如下內(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) 數(shù)據(jù)庫表設(shè)計:在多方加外鍵錯誤做法:在一

44、方加冗余perosnidperson namedreamid1zhangsan11zhangsan2dreamiddreamdescr1earn money2eat a lotc) annotaion: Many2One只需要在多的一端User屬性group進行注解配置ManyToOne /多對一關(guān)聯(lián) User是多的一方 Group是一的一方JoinColumn(name=groupid) /指定User表中生成與Group對應(yīng)的字段名public Group getGroup() return group;d) xml: many-to-one標(biāo)簽會在”多”的一端添加外鍵,相當(dāng)于在數(shù)據(jù)庫中添

45、加外鍵生成的表為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).2 一對多單向關(guān)聯(lián)a) 項目名稱:hibernate_1300_one2many_uni模型(group一對多user)Group(id,name,users)一User(id,name)多設(shè)計時在一的這一端存在著多的集合,生成的數(shù)據(jù)庫表通常是在多的一端生成外鍵.Set users = new HashSet();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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論