锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
浜岀駭緙撳瓨涔熺О榪涚▼綰х殑緙撳瓨鎴朣essionFactory綰х殑緙撳瓨錛岃屼簩綰х紦瀛樺彲浠ヨ鎵鏈夌殑session(hibernate涓殑)鍏變韓浜岀駭緙撳瓨鐨勭敓鍛藉懆鏈熷拰SessionFactory鐨勭敓鍛藉懆鏈熶竴鑷達紝SessionFactory鍙互綆$悊浜岀駭緙撳瓨
浜岀駭緙撳瓨鐨勯厤緗拰浣跨敤錛?/p>
1.灝唀chcache.xml鏂囦歡鎷瘋礉鍒皊rc涓? 浜岀駭緙撳瓨hibernate榛樿鏄紑鍚殑錛屾墜鍔ㄥ紑鍚?/p>
2.寮鍚簩綰х紦瀛橈紝淇敼hibernate.cfg.xml鏂囦歡,
<property name=”hibernate.cache.user_second_level_cache”>true</property>
3.鎸囧畾緙撳瓨浜у搧鎻愪緵鍟?/p>
<property name=”hibernate.cache.provider_calss”>org.hibernate.cache.EhCacheProvider</property>
4.鎸囧畾閭d簺瀹炰綋綾諱嬌鐢ㄤ簩綰х紦瀛橈紙涓ょ鏂規硶錛屾帹鑽愪嬌鐢ㄧ浜岀錛?/p>
絎竴縐嶏細鍦?.hbm.xml涓紝鍦?lt;id>涔嬪墠鍔犲叆
<cache usage=”read-only” />, 浣跨敤浜岀駭緙撳瓨
絎簩縐嶏細鍦╤ibernate.cfg.xml閰嶇疆鏂囦歡涓?鍦?lt;mapping resource=”com/Studnet.hbm.xml” />鍚庨潰鍔犱笂錛?/p>
<class-cache class=” com.Studnet” usage=”read-only” />
浜岀駭緙撳瓨鏄紦瀛樺疄浣撳璞$殑
浜嗚В涓綰х紦瀛樺拰浜岀駭緙撳瓨鐨勪氦浜?/p>
嫻嬭瘯浜岀駭緙撳瓨錛?/strong>
涓錛庡紑鍚袱涓?/strong>session涓彂鍑轟袱嬈?/strong>load鏌ヨ錛?/strong>get涓?/strong>load涓鏍鳳紝鍚屾牱涓嶄細鏌ヨ鏁版嵁搴擄級,
Student sutdent = (Student)session.load(Student.class,1);
sessioin.close();
………..
寮鍚袱涓猻ession涓彂鍑轟袱嬈oad鏌ヨ錛岀涓嬈oad鐨勬椂鍊欎笉浼氬幓鏌ヨ鏁版嵁搴擄紝鍥犱負浠栨槸LAZY鐨勶紝褰撲嬌鐢ㄧ殑鏃跺欐墠鍘繪煡璇㈡暟鎹簱錛?nbsp; 浜岋紟寮鍚袱涓?/strong>session錛屽垎鍒皟鐢?/strong>load錛屽啀浣跨敤sessionFactory娓呮浜岀駭緙撳瓨 Student sutdent = (Student)session.load(Student.class,1); sessioin.close(); ……….. SessionFactory factory = HibernateUtil.getSessionFactory(); //factory.evict(Student.class); //娓呴櫎鎵鏈塖tudent瀵硅薄 Factory.evict(Student.class,1); //娓呴櫎鎸囧畾id=1 鐨勫璞?/p>
寮鍚袱涓猻ession涓彂鍑轟袱嬈oad鏌ヨ錛岀涓嬈oad鐨勬椂鍊欎笉浼氬幓鏌ヨ鏁版嵁搴擄紝鍥犱負浠栨槸LAZY鐨勶紝褰撲嬌鐢ㄧ殑鏃跺欐墠鍘繪煡璇㈡暟鎹簱錛?nbsp; 涓夛紟涓綰х紦瀛樺拰浜岀駭緙撳瓨鐨勪氦浜?/strong> session.setCacheMode(CacheMode.GET); Student sutdent = (Student)session.load(Student.class,1); sessioin.close(); ……….. SessionFactory factory = HibernateUtil.getSessionFactory(); //factory.evict(Student.class); //娓呴櫎鎵鏈塖tudent瀵硅薄 Factory.evict(Student.class,1); //娓呴櫎鎸囧畾id=1 鐨勫璞?/p>
寮鍚袱涓猻ession涓彂鍑轟袱嬈oad鏌ヨ錛岀涓嬈oad鐨勬椂鍊欎笉浼氬幓鏌ヨ鏁版嵁搴擄紝鍥犱負浠栨槸LAZY鐨勶紝褰撲嬌鐢ㄧ殑鏃跺欐墠鍘繪煡璇㈡暟鎹簱錛?nbsp; session.setCacheMode(CacheMode.PUT); Student sutdent = (Student)session.load(Student.class,1); sessioin.close(); ……….. SessionFactory factory = HibernateUtil.getSessionFactory(); //factory.evict(Student.class); //娓呴櫎鎵鏈塖tudent瀵硅薄 Factory.evict(Student.class,1); //娓呴櫎鎸囧畾id=1 鐨勫璞?/p>
寮鍚袱涓猻ession涓彂鍑轟袱嬈oad鏌ヨ錛岀涓嬈oad鐨勬椂鍊欎笉浼氬幓鏌ヨ鏁版嵁搴擄紝鍥犱負浠栨槸LAZY鐨勶紝褰撲嬌鐢ㄧ殑鏃跺欐墠鍘繪煡璇㈡暟鎹簱錛?nbsp; 涓綰х紦瀛樺緢鐭拰session鐨勭敓鍛藉懆鏈熶竴鑷達紝涓綰х紦瀛樹篃鍙玸ession綰х殑緙撳瓨鎴栦簨鍔$紦瀛?/p>
鍝簺鏂規硶鏀寔涓綰х紦瀛橈細 *get() *load() *iterate() 濡備綍綆$悊涓綰х紦瀛橈細 * session.clear() session.evict() 濡備綍閬垮厤涓嬈℃уぇ閲忕殑瀹炰綋鏁版嵁鍏ュ簱瀵艱嚧鍐呭瓨婧㈠嚭 *鍏坒lush錛屽啀clear 濡傛灉鏁版嵁閲忕壒鍒ぇ錛岃冭檻閲囩敤jdbc瀹炵幇錛屽鏋渏dbc涔熶笉鑳芥弧瓚寵姹傦紝鍙互鑰冭檻閲囩敤鏁版嵁搴撴湰韜殑鐗瑰畾瀵煎叆宸ュ叿 涓錛?/strong>Load嫻嬭瘯: 鍦ㄥ悓涓涓?/strong>session涓彂鍑轟袱嬈?/strong>load鏌ヨ Load嫻嬭瘯: 寮鍚袱涓?/strong>session涓彂鍑轟袱嬈?/strong>load鏌ヨ Student sutdent = (Student)session.load(Student.class,1); sessioin.close(); ……….. 浜岋紟Get嫻嬭瘯: 鍦ㄥ悓涓涓?/strong>session涓彂鍑轟袱嬈?/strong>get鏌ヨ 涓夛紟iterate嫻嬭瘯: 鍦ㄥ悓涓涓?/strong>session涓彂鍑轟袱嬈?/strong>iterator鏌ヨ Student student = (Student)session.createQuery(“from Student s where s.id=1”).iterate().next(); System.out.println(student.getName()); student = (Student)session.createQuery(“from Student s where s.id=1”).iterate().next(); System.out.println(student.getName()); 鍥涳紟Iterate鏌ヨ灞炴ф祴璇?/strong>: 鍚屼竴涓?/strong>session涓彂鍑轟袱嬈℃煡璇㈠睘鎬?/strong> String name = (String)session.createQuery(“select s.name from Student s where s.id=1”).iterate().next(); System.out.println(name); String name = (String)session.createQuery(“select s.name from Student s where s.id=1”).iterate().next(); System.out.println(name); Student sutdent = (Student)session.load(Student.class,id); save鐨勬椂鍊欙紝浠栦細鍦ㄧ紦瀛橀噷鏀句竴浠?涓嶄細鍙戝嚭sql錛屽洜涓簊ave鏄嬌鐢ㄧ紦瀛樼殑 鍏紟鍚屼竴涓?/strong>session涓厛璋冪敤load鏌ヨ錛岀劧鍚庢墽琛?/strong>sessio.clear()鎴?/strong>session.evict()錛屽啀璋冪敤load鏌ヨ Student sutdent = (Student)session.load(Student.class,1); Student sutdent = (Student)session.load(Student.class,1); 涓婇潰鐨勮鍙ラ兘浼氬彂鍑簊ql 鍥犱負涓綰х紦瀛樹腑鐨勫疄浣撹娓呴櫎浜?/p>
涓冿紟鍚戞暟鎹簱涓壒閲忓姞鍏?/strong>1000鏉℃暟鎹?/strong> for(int i=0;i<1000;i++){ //姣?0鏉℃暟鎹氨寮哄埗session灝嗘暟鎹寔涔呭寲錛屽悓鏃舵竻闄ょ紦瀛橈紝閬垮厤澶ч噺鏁版嵁閫犳垚鍐呭瓨婧㈠嚭 } } hibernate鏌ヨ緙撳瓨(hibernate榛樿鏄叧闂殑) 鏌ヨ緙撳瓨鏄拡瀵規櫘閫氬睘鎬х粨鏋滈泦鐨勭紦瀛?/p>
瀵瑰疄浣撳璞$殑緇撴灉闆嗗彧緙撳瓨id 鏌ヨ緙撳瓨鐨勭敓鍛藉懆鏈燂紝褰撳墠鍏寵仈鐨勮〃鍙戠敓淇敼錛岄偅涔堟煡璇㈢紦瀛樼敓鍛藉懆鏈熺粨鏉?/p>
鏌ヨ緙撳瓨鐨勯厤緗拰浣跨敤錛?/p>
1. 鍚敤鏌ヨ緙撳瓨錛氬湪hibernate.cfg.xml涓姞鍏ワ細 <property name=”hibernate.cache.use_query_cache”>true</property> 嫻嬭瘯鏌ヨ緙撳瓨錛?/strong> 涓錛?nbsp; Query query = session.createQuery(“select s.name from Student s”); //鍚敤鏌ヨ緙撳瓨 query.setCacheable(true); List names = query.list(); for(Iterator iter = names.terator();iter.hasNext();){ } System.out.println(“------------------------------------------”); query = session.createQuery(“select s.name from Student s”); //鍚敤鏌ヨ緙撳瓨 query.setCacheable(true); names = query.list(); for(Iterator iter = names.terator();iter.hasNext();){ } 絎簩嬈℃病鏈夊幓鏌ヨ鏁版嵁搴擄紝鍥犱負鍚敤浜嗘煡璇㈢紦瀛?/p>
浜岋紟 Query query = session.createQuery(“select s.name from Student s”); //鍚敤鏌ヨ緙撳瓨 query.setCacheable(true); List names = query.list(); for(Iterator iter = names.terator();iter.hasNext();){ } session.close(); System.out.println(“------------------------------------------”); ……… Query query = session.createQuery(“select s.name from Student s”); //鍚敤鏌ヨ緙撳瓨 query.setCacheable(true); List names = query.list(); for(Iterator iter = names.terator();iter.hasNext();){ } 絎簩嬈℃病鏈夊幓鏌ヨ鏁版嵁搴擄紝鍥犱負鏌ヨ緙撳瓨鐢熷懡鍛ㄦ湡涓巗ession鐢熷懡鍛ㄦ湡鏃犲叧 涓夛紟 Query query = session.createQuery(“select s.name from Student s”); //鍚敤鏌ヨ緙撳瓨 query.setCacheable(true); for(Iterator iter =query.iterate();iter.hasNext();){ } session.close(); System.out.println(“------------------------------------------”); ……… Query query = session.createQuery(“select s.name from Student s”); //鍚敤鏌ヨ緙撳瓨 query.setCacheable(true); for(Iterator iter = query.iterate();iter.hasNext();){ } 絎簩鍘繪煡璇㈡暟鎹簱錛屽洜涓烘煡璇㈢紦瀛樺彧瀵筿uery.list()璧蜂綔鐢紝瀵筿uery.iterate()涓嶈搗浣滅敤,涔熷氨鏄query.iterate()涓嶄嬌鐢ㄦ煡璇㈢紦瀛?/p>
鍥涳紟 Query query = session.createQuery(“ from Student s”); //query.setCacheable(true); List students = query.list(); for(Iterator iter = students.iterate();iter.hasNext();){ } session.close(); System.out.println(“------------------------------------------”); ……… Query query = session.createQuery(“ from Student s”); //query.setCacheable(true); List students = query.list(); for(Iterator iter = students.iterate();iter.hasNext();){ } 絎簩鍘繪煡璇㈡暟鎹簱錛屽洜涓簂ist榛樿姣忔閮戒細鍙戝嚭鏌ヨsql 浜旓紟 Query query = session.createQuery(“ from Student s”); query.setCacheable(true); List students = query.list(); for(Iterator iter = students.iterate();iter.hasNext();){ } session.close(); System.out.println(“------------------------------------------”); ……… Query query = session.createQuery(“ from Student s”); query.setCacheable(true); List students = query.list(); for(Iterator iter = students.iterate();iter.hasNext();){ } 絎簩鍘繪煡璇㈡暟鎹簱鏃訛紝浼氬彂鍑篘鏉ql璇彞錛屽洜涓哄紑鍚簡鏌ヨ緙撳瓨錛屽叧闂簡浜岀駭緙撳瓨錛岄偅涔堟煡璇㈢紦瀛樹細緙撳瓨瀹炰綋瀵硅薄鐨刬d錛屾墍浠ibernate浼氭牴鎹疄浣撳璞$殑id鍘繪煡璇㈢浉搴旂殑瀹炰綋錛屽鏋滅紦瀛樹腑涓嶅瓨鍦ㄧ浉搴旂殑瀹炰綋錛岄偅涔堝皢鍙戝嚭鏍規嵁瀹炰綋id鏌ヨ鐨剆ql璇彞錛屽惁鍒欎笉浼氬彂鍑簊ql錛屼嬌鐢ㄧ紦瀛樹腑鐨勬暟鎹?/p>
鍏紟 Query query = session.createQuery(“ from Student s”); query.setCacheable(true); List students = query.list(); for(Iterator iter = students.iterate();iter.hasNext();){ } session.close(); System.out.println(“------------------------------------------”); ……… Query query = session.createQuery(“ from Student s”); query.setCacheable(true); List students = query.list(); for(Iterator iter = students.iterate();iter.hasNext();){ } 絎簩涓嶄細鍙戝嚭sql錛屽洜涓哄紑鍚簡浜岀駭緙撳瓨鍜屾煡璇㈢紦瀛橈紝鏌ヨ緙撳瓨緙撳瓨浜嗗疄浣撳璞$殑id鍒楄〃錛宧ibernate浼氭牴鎹疄浣撳璞$殑id鍒楄〃鍒頒簩綰х紦瀛樹腑鍙栧緱鐩稿簲鐨勬暟鎹?/p>
]]>
]]>
鏌ヨ鏁版嵁搴撴瘡嬈℃渶澶氳繑鍥?/strong>50鏉$粨鏋滐細
<property name=”hibernate.jdbc.fetch_size”>50</property>
30鏉℃洿鏂版暟鎹簱涓嬈?/strong>:
<property name= ”hibernatejdbc.batch_size”>30</property>
涓錛?/strong>hibernate 鎶撳彇絳栫暐(Fetch) 鍗曠浠g悊鎵歸噺鎶撳彇
1.fetch=”select” 鍏寵仈瀹炰綋
//fetch 榛樿鏄痵elect
<many-to-one name="businessId" column="business_id" insert="true" update="true" fetch="select">
Student student = (Student)session.load(Student.class,1);
System.out.println(student.getName());
System.out.println(student.getClasses().getName()); //澶氬涓涓殑灞炴х彮綰э紝鑾峰彇鐝駭鍚嶇О
Fetch=”select” ,涓婇潰紼嬪簭浼氬彂2鏉ql璇彞錛岀浜屾潯鍙戦佷竴鏉elect璇彞鎶撳彇褰撳墠瀵硅薄鍏寵仈瀹炰綋鎴栭泦鍚?(榪欓噷鎸囨槸鐝駭鍚嶇О)
2.fetch=” join” 鍏寵仈瀹炰綋
//fetch 璁劇疆鎴?join
<many-to-one name="businessId" column="business_id" insert="true" update="true"
fetch=" join ">
Student student = (Student)session.load(Student.class,1);
System.out.println(student.getName());
System.out.println(student.getClasses().getName()); //澶氬涓涓殑灞炴х彮綰э紝鑾峰彇鐝駭鍚嶇О
fetch=” join” , 涓婇潰紼嬪簭浼氬彂1鏉ql璇彞錛?hibernate浼氶氳繃select浣跨敤澶栭摼鎺ユ潵鍔犺澆鍏跺叧鑱斿疄浣撴垨闆嗗悎錛屾鏃秎azy浼氬け鏁?nbsp;
浜岋紟hibernate 鎶撳彇絳栫暐(Fetch) 闆嗗悎浠g悊鎵歸噺鎶撳彇
1.
//fetch 榛樿鏄痵elect
<set name="students" inverse="true" cascade="all" fetch="select">
</set>
Classes cla = (Classes)session.load(Classes.class,1);
System.out.println(cla.getName());
for(Iterator iter = cla.getStudents().iterator();iter.hasNext();){
}
fetch=”select” ,涓婇潰紼嬪簭鐢ㄥ埌浜嗗氨鍙憇ql璇彞,絎簩浠庡驚鐜腑鍙戜簡N鏉?濡傛灉錛歠etch=”subselect”,鍒欏彧鏄彂閫佷竴鏉¤鍙ワ紝瑙佷笅闈?/p>
2 fetch=”join”
//fetch 璁劇疆鎴恓oin
<set name="students" inverse="true" cascade="all" fetch="join">
</set>
Classes cla = (Classes)session.load(Classes.class,1);
System.out.println(cla.getName());
for(Iterator iter = cla.getStudents().iterator();iter.hasNext();){
}
Fetch=”select” ,涓婇潰紼嬪簭鍙彂浜嗕竴鏉ql璇彞
涓夛紟hibernate 鎶撳彇絳栫暐(Fetch) 闆嗗悎浠g悊鎵歸噺鎶撳彇
2.
//fetch璁劇疆鎴恠ubselect
<set name="students" inverse="true" cascade="all" fetch="subselect">
</set>
List classesList = session.createQuery(“select c from Classes c where c.id in(1,2,3)”);
for(Iterator iter=classesList.iterator();iter.hasNext();){
}
}
Fetch=”subselct” ,鍙﹀鍙戦佷竴鏉elect璇彞鎶撳彇鍦ㄥ墠闈㈡煡璇㈠埌鐨勬墍鏈夊疄浣撳璞$殑鍏寵仈闆嗗悎
鍥涳紟hibernate 鎵歸噺絳栫暐batch-size灞炴э紝鍙互鎵歸噺鍔犺澆瀹炰綋綾伙紝
鍙傝Classes.hbm.xml錛屽悓鏃墮泦鍚堜篃鍙互鏄嬌鐢紝濡傦細
鍦ㄩ厤緗枃浠秇bm.xml 璁劇疆涓細
<class name="com.Classes " table="tb_classes" batch-size=”3”>
List students = session.createQuery(“select s from Student s where s.id in(:ids)”).setParameterList(“:ids”,new Object[]{1,11,21,31,41,51,61,71,81,91}).list();
for(Iterator iter=students.iterator();iter.hasNext();){
}
褰撶浜屼釜for寰幆鏃訛紝姣忔鍔犺澆 涔嬪墠璁劇疆鐨?鏁伴噺 瀹炰綋瀵硅薄,
涓句釜渚嬪瓙錛?/p>
//鏌ヨid=1鐨勯偅鏉¤褰曪紝浣跨敤鎮茶閿?/p>
User user = (User)session.load(User.class, 1 , 浣跨敤浜嗘暟鎹簱涓殑 for update 涔愯閿?/strong> 澶у鏁板熀浜庢暟鎹増鏈褰曟満鍒訛紙version錛夊疄鐜幫紝涓鍗婃槸鍦ㄦ暟鎹簱琛ㄥ姞鍏ヤ竴涓獀ersion瀛楁錛岃鍙栨暟鎹椂灝嗙増鏈彿涓鍚岃鍑猴紝涔嬪悗鏇存柊鏁版嵁鏃剁増鏈彿鍔犱竴錛屽鏋滄彁浜ゆ暟鎹椂鐗堟湰鍙峰皬浜庢垨絳変簬鏁版嵁搴撹〃涓殑鐗堟湰鍙鳳紝鍒欒涓烘暟鎹槸榪囨湡鐨勶紝鍚﹀垯緇欎簣鏇存柊銆?/p>
鍏跺疄騫墮潪鏄攣錛屾槸涓縐嶅啿紿佹嫻?nbsp; 鍦?.hm.xml涓?娣誨姞綰㈣壊閮ㄥ垎錛?/p>
<class name="com.tao3c.orm.TbBusinessInfo" 鍏朵腑version鏄痗om.tao3c.orm.TbBusinessInfo綾葷殑灞炴э紝hiernbate浼氬幓緇存姢鐨勶紝涓嶇敤鑷繁鍘昏
]]>
涓句釜渚嬪瓙錛?/p>
//鏌ヨid=1鐨勯偅鏉¤褰曪紝浣跨敤鎮茶閿?/p>
User user = (User)session.load(User.class, 1 , 浣跨敤浜嗘暟鎹簱涓殑 for update 涔愯閿?/strong> 澶у鏁板熀浜庢暟鎹増鏈褰曟満鍒訛紙version錛夊疄鐜幫紝涓鍗婃槸鍦ㄦ暟鎹簱琛ㄥ姞鍏ヤ竴涓獀ersion瀛楁錛岃鍙栨暟鎹椂灝嗙増鏈彿涓鍚岃鍑猴紝涔嬪悗鏇存柊鏁版嵁鏃剁増鏈彿鍔犱竴錛屽鏋滄彁浜ゆ暟鎹椂鐗堟湰鍙峰皬浜庢垨絳変簬鏁版嵁搴撹〃涓殑鐗堟湰鍙鳳紝鍒欒涓烘暟鎹槸榪囨湡鐨勶紝鍚﹀垯緇欎簣鏇存柊銆?/p>
鍏跺疄騫墮潪鏄攣錛屾槸涓縐嶅啿紿佹嫻?nbsp; 鍦?.hm.xml涓?娣誨姞綰㈣壊閮ㄥ垎錛?/p>
<class name="com.tao3c.orm.TbBusinessInfo" 鍏朵腑version鏄痗om.tao3c.orm.TbBusinessInfo綾葷殑灞炴э紝hiernbate浼氬幓緇存姢鐨勶紝涓嶇敤鑷繁鍘昏
]]>
User--à Role
user(id,name)
User綾伙細
private int
Role綾伙細
private int id;
User.hbm.xml涓細
<set name=”roles” table=”t_user_role”>
</set>
榪欐牱錛宧ibernate浼氳嚜鍔ㄤ駭鐢熶腑闂磋〃t_user_role(userid,roleid) 騫朵笖鏄鍚堜富閿紝userid涓簍_user鐨勫閿紝roleid涓簍_role鐨勫閿?/p>
浜岋紟hibernate澶氬澶氱殑瀛樺偍
Role r1 = new Role();
r1.setName(“鏁版嵁褰曞叆浜哄憳”);
Role r2 = new Role();
r2.setName(“鍟嗗姟涓葷”);
Role r3 = new Role();
r3.setName(“澶у尯緇忕悊”);
User u1 = new User();
u1.setName(“10”);
Set u1Roles = new HashSet();
u1Roles.add(r1);
u1Roles.add(r2);
u1.setRoles(u1Roles);
User u2 = new User();
u1.setName(“紲栧効”);
Set u2Roles = new HashSet();
u2Roles.add(r2);
u2Roles.add(r3);
u2.setRoles(u2Roles);
User u3 = new User();
u3.setName(“鏉頒雞”);
Set u3Roles = new HashSet();
u3Roles.add(r1);
u3Roles.add(r2);
u3Roles.add(r3);
u3.setRoles(u3Roles);
session.save(r1);
session.save(r2);
session.save(r3);
session.save(u1);
session.save(u2);
session.save(u3);
緇撴潫涔嬪悗錛屽湪絎笁寮犺〃涓篃鏈夋暟鎹?/p>
涓夛紟hibernate澶氬澶氱殑鍔犺澆
User user = (User)session.load(User.class,1);
System.out.println(user.getName());
for(Iterator iter = user.getRoles().iterator();iter.hasNext();){
}
涓夛紟hibernate澶氬澶氱殑 鍙屽悜鏄犲皠
User ß--.-àRole
user(id,name)
User綾伙細
private int
Role綾伙細
private int id;
User.hbm.xml涓細
<set name=”roles” table=”t_user_role”>
</set>
Role.hbm.xml涓細
<set name=”roles” table=”t_user_role”>
</set>
娉ㄦ剰錛屼笂闈腑闂磋〃鍚嶅瓧鏄竴鏍風殑
榪欐牱錛宧ibernate涔熶細鑷姩浜х敓涓棿琛╰_user_role(userid,roleid) 騫朵笖鏄鍚堜富閿紝userid涓簍_user鐨勫閿紝roleid涓簍_role鐨勫閿?/p>
User--à Role
user(id,name)
User綾伙細
private int
Role綾伙細
private int id;
User.hbm.xml涓細
<set name=”roles” table=”t_user_role”>
</set>
榪欐牱錛宧ibernate浼氳嚜鍔ㄤ駭鐢熶腑闂磋〃t_user_role(userid,roleid) 騫朵笖鏄鍚堜富閿紝userid涓簍_user鐨勫閿紝roleid涓簍_role鐨勫閿?/p>
浜岋紟hibernate澶氬澶氱殑瀛樺偍
Role r1 = new Role();
r1.setName(“鏁版嵁褰曞叆浜哄憳”);
Role r2 = new Role();
r2.setName(“鍟嗗姟涓葷”);
Role r3 = new Role();
r3.setName(“澶у尯緇忕悊”);
User u1 = new User();
u1.setName(“10”);
Set u1Roles = new HashSet();
u1Roles.add(r1);
u1Roles.add(r2);
u1.setRoles(u1Roles);
User u2 = new User();
u1.setName(“紲栧効”);
Set u2Roles = new HashSet();
u2Roles.add(r2);
u2Roles.add(r3);
u2.setRoles(u2Roles);
User u3 = new User();
u3.setName(“鏉頒雞”);
Set u3Roles = new HashSet();
u3Roles.add(r1);
u3Roles.add(r2);
u3Roles.add(r3);
u3.setRoles(u3Roles);
session.save(r1);
session.save(r2);
session.save(r3);
session.save(u1);
session.save(u2);
session.save(u3);
緇撴潫涔嬪悗錛屽湪絎笁寮犺〃涓篃鏈夋暟鎹?/p>
涓夛紟hibernate澶氬澶氱殑鍔犺澆
User user = (User)session.load(User.class,1);
System.out.println(user.getName());
for(Iterator iter = user.getRoles().iterator();iter.hasNext();){
}
涓夛紟hibernate澶氬澶氱殑 鍙屽悜鏄犲皠
User ß--.-àRole
user(id,name)
User綾伙細
private int
Role綾伙細
private int id;
User.hbm.xml涓細
<set name=”roles” table=”t_user_role”>
</set>
Role.hbm.xml涓細
<set name=”roles” table=”t_user_role”>
</set>
娉ㄦ剰錛屼笂闈腑闂磋〃鍚嶅瓧鏄竴鏍風殑
榪欐牱錛宧ibernate涔熶細鑷姩浜х敓涓棿琛╰_user_role(userid,roleid) 騫朵笖鏄鍚堜富閿紝userid涓簍_user鐨勫閿紝roleid涓簍_role鐨勫閿?/p>
1.涓ょ閰嶇疆鏂囦歡錛?/p>
A.hibernate.cfg.xml鍜孊.hibernate.properties
A涓彲鍚槧灝勬枃浠剁殑閰嶇疆錛岃孊涓環ard codes鍔犳槧灝勬枃浠躲?/p>
A.Configuration config=new Configuration().config();
B. Configuration config=new Configuration();
config.addClass(TUser.class);
2.浣犱笉蹇呬竴瀹氱敤hibernate.cfg.xml鎴杊ibernate.properties榪欎袱鏂囦歡鍚嶏紝浣犱篃涓嶄竴瀹氶潪寰楁妸閰嶇疆鏂囦歡鏀懼湪Classes涓嬶紝銆File file=new File("c:\\sample\\myhibernate.xml");銆Configuration config=new Configuration().config(file);
3. session.Flush() 寮哄埗鏁版嵁搴撶珛鍗沖悓姝ワ紝褰撶敤浜嬪姟鏃訛紝涓嶅繀鐢╢lush,浜嬪姟鎻愪氦鑷姩璋冪敤flush鍦╯ession鍏抽棴鏃朵篃浼氳皟鐢╢lush
4. Hibernate鎬繪槸浣跨敤瀵硅薄綾誨瀷浣滀負瀛楁綾誨瀷
5. XDoclet涓撻棬寤虹珛浜唄ibernate doclet,灝辨槸鍦╦ava浠g爜涓婂姞涓婁竴浜沯ava docTag錛屽悗鏉ュ啀璁Doclet鍒嗘瀽璇ava浠g爜錛岀敓鎴愭槧灝勬枃浠?
6.HQL瀛愬彞鏈韓澶у皬鍐欐棤鍏籌紝浣嗘槸鍏朵腑鍑虹幇鐨勭被鍚嶅拰灞炴у悕蹇呴』娉ㄦ剰澶у皬鍐欏尯鍒嗐?/p>
7.鍏崇郴錛氥Constrained : 綰︽潫錛岃〃鏄庝富鎺ц〃鐨勪富閿笂鏄惁瀛樺湪涓涓閿紙foreigh key錛夊鍏惰繘琛岀害鏉熴?/p>
property-ref:鍏寵仈綾諱腑鐢ㄤ簬涓庝富鎺х被鐩稿叧鑱旂殑灞炴у悕錛岄粯璁や負鍏寵仈綾葷殑涓婚敭灞炴у悕
鍗曞悜涓瀵瑰闇鍦ㄤ竴鏂歸厤緗紝鍙屽悜涓瀵瑰闇鍦ㄥ弻鏂硅繘琛岄厤緗?/p>
8.lazy=false:琚姩鏂圭殑璁板綍鐢県ibernate璐熻矗璁板彇錛屼箣鍚庡瓨鏀懼湪涓繪帶鏂規寚瀹氱殑Collection綾誨瀷灞炴т腑
9. java.util.Set鎴杗et.sof.hibernate.collecton.Bag綾誨瀷鐨凜ollection
10.閲嶈錛歩nverse:鐢ㄤ簬鏍囪瘑鍙屽悜鍏寵仈涓殑琚姩鏂逛竴绔?/p>
inverse=false鐨勪竴鏂癸紙涓繪帶鏂癸級璐熻矗緇存姢鍏寵仈鍏崇郴.榛樿鍊鹼細false
11.batch-size:閲囩敤寤惰繜鍔犺澆鐗瑰緛鏃訛紝涓嬈¤鍏ョ殑鏁版嵁鏁版槰銆?/p>
12.涓瀵瑰閫氳繃涓繪帶鏂規洿鏂幫紙涓繪帶鏂逛負涓鏂規椂錛?/p>
user.getAddresses().add(addr);
session.save(user);//閫氳繃涓繪帶瀵硅薄綰ц仈鏇存柊
13.鍦╫ne-to-many 鍏崇郴涓紝灝唌any 涓鏂硅涓轟富鍔ㄦ柟錛坕nverse=false錛夊皢鏈夊姪鎬ц兘鐨勬敼鍠勩傚湪涓鏂硅緗叧緋繪椂錛宨nverse=true,鍗沖皢涓繪帶鏉冧氦緇欏鏂癸紝銆榪欐牱澶氭柟鍙富鍔ㄤ粠涓鏂硅幏寰梖oreign key,鐒跺悗涓嬈nsert鍗沖彲瀹屽伐銆?/p>
addr.setUser(user);//璁劇疆鍏寵仈鐨凾User瀵硅薄
user.getAddresses().add(addr);
session.save(user);//綰ц仈鏇存柊
14.鍙湁璁句負涓繪帶鏂圭殑涓鏂規墠鍏沖績錛堣闂級瀵規柟鐨勫睘鎬э紝琚姩鏂規槸涓嶅叧蹇冨鏂圭殑灞炴х殑銆?/p>
15.one-to-many涓巑any-to-one鑺傜偣鐨勯厤緗睘鎬т笉鍚岋細
涓瀵瑰鍏崇郴澶氫簡lazy鍜宨nverse涓や釜灞炴у瀵瑰鑺傜偣灞炴э細
column:涓棿鏄犲皠琛ㄤ腑錛屽叧鑱旂洰鏍囪〃鐨勫叧鑱斿瓧孌?/p>
class:綾誨悕錛屽叧鑱旂洰鏍囩被
outer-join:鏄惁浣跨敤澶栬仈鎺?/p>
娉ㄦ剰:access鏄緗睘鎬у肩殑璇誨彇鏂瑰紡銆?/p>
column鏄緗叧鑱斿瓧孌點?/p>
16.澶氬澶氾紝娉ㄦ剰涓ゆ柟閮借璁劇疆inverse鍜宭azy,cascade鍙兘璁句負insert-update
澶氬澶氬叧緋諱腑錛岀敱浜庡叧鑱斿叧緋繪槸涓ゅ紶琛ㄧ浉浜掑紩鐢紝鍥犳鍦ㄤ繚瀛樺叧緋葷姸鎬佹椂蹇呴』瀵瑰弻鏂瑰悓鏃朵繚瀛樸?/p>
group1.getRoles().add(role1);銆role1.getGroups().add(group1);
session.save(role1);銆session.save(group1);
17.鍏充簬vo鍜宲o銆vo緇忚繃hibernate瀹歸噺澶勭悊錛屽氨鍙樻垚浜唒o(璇o鐨勫紩鐢ㄥ皢琚鍣ㄤ繚瀛橈紝騫朵笖鍦╯ession鍏抽棴鏃秄lush,鍥犳po濡傛灉鍐嶄紶鍒板叾瀹冨湴鏂規敼鍙樹簡錛屽氨鍗遍櫓浜?銆vo鍜宲o鐩鎬簰杞崲錛欱eanUtils.copyProperties(anotherUser,user);
18.瀵逛簬save鎿嶄綔鑰岃█錛屽鏋滃璞″凡緇忎笌Session鐩稿叧鑱旓紙鍗沖凡緇忚鍔犲叆Session鐨勫疄浣撳鍣ㄤ腑錛夛紝鍒欐棤闇榪涜鍏蜂綋鐨勬搷浣溿傚洜涓轟箣鍚庣殑Session.flush榪囩▼涓紝Hibernate 浼氬姝ゅ疄浣撳鍣ㄤ腑鐨勫璞¤繘琛岄亶鍘嗭紝鏌ユ壘鍑哄彂鐢熷彉鍖栫殑瀹炰綋錛岀敓鎴愬茍鎵ц鐩稿簲鐨剈pdate 璇彞銆?/p>
19.濡傛灉鎴戜滑閲囩敤浜嗗歡榪熷姞杞芥満鍒訛紝浣嗗笇鏈涘湪涓浜涙儏鍐典笅錛屽疄鐜伴潪寤惰繜鍔犺澆鏃剁殑鍔熻兘錛屼篃灝辨槸璇達紝鎴戜滑甯屾湜鍦⊿ession鍏抽棴鍚庯紝渚濈劧鍏佽鎿嶄綔user鐨刟ddresses 灞炴?Hibernate.initialize鏂規硶鍙互閫氳繃寮哄埗鍔犺澆鍏寵仈瀵硅薄瀹炵幇榪欎竴鍔熻兘錛?榪欎篃姝f槸鎴戜滑涓轟粈涔堝湪緙栧啓POJO鏃訛紝蹇呴』鐢↗DK Collection鎺ュ彛錛堝Set,Map錛? 鑰岄潪鐗瑰畾鐨凧DK Collection瀹炵幇綾伙紙濡侶ashSet銆丠ashMap錛夌敵鏄嶤ollection灞炴х殑 鍘熷洜銆?/p>
20.浜嬪姟錛氫粠sessionFactory鑾峰緱session,鍏惰嚜鍔ㄦ彁浜ゅ睘鎬у氨宸茬粡鍏抽棴(AutoCommit=false),姝ゆ椂鑻ユ墽琛屼簡jdbc鎿嶄綔錛屽鏋滀笉鏄懼紡璋冪敤session.BeginTransaction(),鏄笉浼氭墽琛屼簨鍔℃搷浣滅殑銆?/p>
jdbc transaction:鍩轟簬鍚屼竴涓猻ession(灝辨槸鍚屼竴涓猚onnection)鐨勪簨鍔?
jta銆transaction:璺╯ession錛堣法connection錛変簨鍔?
瀵逛簬jta浜嬪姟錛屾湁涓夌瀹炵幇鏂規硶錛?/p>
A銆俇serTransaction tx=new InitialContext().lookup("...");
tx.commit();
B. 浣跨敤hibernate灝佽鐨勬柟娉曪細(涓嶆帹鑽?
Transaction tx=session.beginTransaction();
tx.commit();
C. 浣跨敤ejb涔媠essionBean鐨勪簨鍔℃妧鎸佹柟娉曪紝浣犲彧瑕佸湪鎶婇渶瑕佸湪鍙戝竷鎻忚堪絎︿腑錛屾妸闇瑕乯ta浜嬪姟鐨勬柟娉曞0鏄庝負require鍗沖彲
21.鎮茶閿侊紝涔愯閿侊細銆涔愯閿佷竴鑸氳繃version鏉ュ疄鐜幫紝娉ㄦ剰version鑺傜偣蹇呴』鍑虹幇鍦╥d鍚庛?/p>
22.Hibernate涓紝鍙互閫氳繃Criteria.setFirstResult鍜孋riteria.setFetchSize鏂規硶璁懼畾鍒嗛〉鑼冨洿銆?/p>
Query鎺ュ彛涓篃鎻愪緵浜嗕笌鍏朵竴鑷寸殑鏂規硶錛宧ibernate涓昏鍦╠ialect綾諱腑瀹炵幇鍦ㄨ繖涓姛鑳姐?/p>
23.cache
……
net.sf.ehcache.hibernate.Provider銆
榪橀渶瀵筫cache鏈韓榪涢厤緗?/p>
涔嬪悗鍦ㄦ槧灝勬枃浠朵腑鎸囧畾鍚勪釜鏄犲皠瀹炰綋鐨刢ache絳栫暐
....
....
***************************************************** Query.list()璺烸uery.iterate()鐨勪笉鍚岋細瀵逛簬query.list()鎬繪槸閫氳繃涓鏉ql璇彞鑾峰彇鎵鏈夎褰?鐒跺悗灝嗗叾璇誨嚭錛屽~鍏ojo榪斿洖; 浣嗘槸query.iterate()錛屽垯鏄鍏堥氳繃涓鏉elect SQL 鑾峰彇鎵鏈夌鍚堟煡璇㈡潯浠剁殑璁板綍鐨?id錛屽啀瀵硅繖涓猧d 闆嗗悎榪涜寰幆鎿嶄綔錛岄氳繃鍗曠嫭鐨凷elect SQL 鍙栧嚭姣忎釜id 鎵瀵瑰簲鐨勮 褰曪紝涔嬪悗濉叆POJO涓繑鍥炪?/p>
涔熷氨鏄錛屽浜巐ist 鎿嶄綔錛岄渶瑕佷竴鏉QL 瀹屾垚銆傝屽浜巌terate 鎿嶄綔錛岄渶瑕乶+1 鏉QL銆傦紝list鏂規硶灝嗕笉浼氫粠Cache涓鍙栨暟鎹俰terator鍗翠細銆?/p>
24.ThreadLocal:瀹冧細涓烘瘡涓嚎紼嬬淮鎶や竴涓鏈夌殑鍙橀噺絀洪棿銆傚疄闄呬笂錛?鍏跺疄鐜板師鐞嗘槸鍦↗VM 涓淮鎶や竴涓狹ap錛岃繖涓狹ap鐨刱ey 灝辨槸褰撳墠鐨勭嚎紼嬪璞★紝鑰寁alue鍒欐槸綰跨▼閫氳繃ThreadLocal.set鏂規硶淇濆瓨鐨勫璞″疄渚嬨傚綋綰跨▼璋冪敤ThreadLocal.get鏂規硶鏃訛紝 ThreadLocal浼氭牴鎹綋鍓嶇嚎紼嬪璞$殑寮曠敤錛屽彇鍑篗ap涓搴旂殑瀵硅薄榪斿洖銆?/p>
榪欐牱錛孴hreadLocal閫氳繃浠ュ悇涓嚎紼嬪璞$殑寮曠敤浣滀負鍖哄垎錛屼粠鑰屽皢涓嶅悓綰跨▼鐨勫彉閲忛殧紱誨紑鏉ャ?/p>
25.Hibernate瀹樻柟寮鍙戞墜鍐屾爣鍑嗙ず渚?
public class HibernateUtil { private static SessionFactory sessionFactory;
static { try { // Create the SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (HibernateException ex) { throw new RuntimeException( "Configuration problem: " + ex.getMessage(), ex );
} } public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException { Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet if (s == null) { s = sessionFactory.openSession();
session.set(s);
} return s;
} public static void closeSession() throws HibernateException { Session s = (Session) session.get();
session.set(null);
if (s != null) s.close();
} }
26.閫氳繃filter瀹炵幇session鐨勯噸鐢細
public class PersistenceFilter implements Filter { protected static ThreadLocal hibernateHolder = new ThreadLocal();
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { hibernateHolder.set(getSession());
try { …… chain.doFilter(request, response);
…… } finally { Session sess = (Session)hibernateHolder.get();
if (sess != null) { hibernateHolder.set(null);
try { sess.close(); } catch (HibernateException ex) { throw new ServletException(ex);
} } } } ……}