聽

聽2

聽3


聽5

聽6

聽7


聽9

10

11

12

13

14


16

17

18

19

20

21



24

25

26

27

28

29

30


32

33

34

35


37

38

39

40

41

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 聽hibernate鐨刬nverse鍜?many錛峵o錛峬any 鍏崇郴嫻呰皥
Inverse鏄痟ibernate鍙屽悜鍏崇郴涓殑鍩烘湰姒傚康錛屽綋鐒跺浜庡鏁板疄浣擄紝鎴戜滑騫朵笉闇瑕佸弻鍚戝叧鑱旓紝鏇村鐨勫彲鑳戒細閫夋嫨鍗曞悜鍏寵仈錛屽喌涓旀垜浠ぇ澶氭暟浜轟竴鑸噰鐢ㄤ竴瀵瑰鍏崇郴錛岃屼竴瀵瑰鍙屽悜鍏寵仈鐨勫彟涓绔細澶氬涓鐨刬nverse灞炴ф槸涓嶅瓨鍦紝鍏跺疄瀹冮粯璁ゅ氨鏄痠nverse=false.浠庤岄槻姝簡鍦ㄤ竴瀵瑰绔儭涔辮緗甶nverse涔熶笉鑷充簬鍑洪敊銆備絾鏄痠nverse璁劇疆涓嶅綋紜疄浼氬甫鏉ュ緢澶х殑鎬ц兘褰卞搷錛岃繖鐐規槸鎴戜滑蹇呴』鍏蟲敞鐨勩?/p>
榪欑瘒鏂囩珷宸茬粡璇︾粏鍒嗘瀽浜唅nverse璁劇疆涓嶅綋甯︽潵鐨勫獎鍝嶏細
http://www.hibernate.org/155.html
鐪嬩簡榪欑瘒鏂囩珷錛岃繕鏄緢鏈夊繀瑕佸啀鍐欎笅涓浜涙葷粨鐨勶細
1錛塱nverse涓彁鍙婄殑side鍏跺疄鏄寚涓涓被鎴栬呰〃鐨勬蹇碉紝鍙屽悜鍏寵仈鍏跺疄鏄寚鍙屾柟閮藉彲浠ュ彇寰楀鏂圭殑搴旂敤銆?/p>
2錛夌淮鎶ゅ叧緋昏繖涓悕璇嶈繕鏄◢鏄炬ā緋婃垨鑰呮櫐娑┿傛垜浠竴鑸A綾繪垨鑰匒琛紙榪欓噷鐨勮〃鐨勬槸鎸囧瀵瑰鐨勮繛鎺ヨ〃錛夋湁璐d換緇存姢鍏崇郴錛屽叾瀹炶繖閲岀殑鎰忔濇槸璇達紝鎴戝湪搴旂敤鍦ㄦ洿鏂幫紝鍒涘緩錛屽垹闄わ紙璇誨氨涓嶇敤璇翠簡錛屽弻鍚戝紩鐢ㄦ鏄負浜嗘柟渚胯鑰屽嚭鐜幫級A綾繪垨鑰匒琛ㄦ椂錛屾鏃跺垱寤虹殑SQL璇彞蹇呴』鏈夎矗浠諱繚璇佸叧緋葷殑姝g‘淇敼銆?/p>
3錛塱nverse=false鐨剆ide錛坰ide鍏跺疄鏄寚inverse錛漟alse鎵浣嶄簬鐨刢lass鍏冪礌錛夌鏈夎矗浠葷淮鎶ゅ叧緋伙紝鑰宨nverse錛漷rue绔棤欏葷淮鎶よ繖浜涘叧緋匯?/p>
4錛夋垜浠inverse璁劇珛涓嶅綋浼氬鑷存ц兘浣庝笅錛屽叾瀹炴槸璇磇nverse璁劇珛涓嶅綋錛屼細浜х敓澶氫綑閲嶅鐨凷QL璇彞鐢氳嚦鑷翠嬌JDBC exception鐨則hrow銆傝繖鏄垜浠湪寤虹珛瀹炰綋綾誨叧緋繪椂蹇呴』闇瑕佸叧娉ㄧ殑鍦版柟銆備竴鑸潵璇達紝inverse錛漷rue鏄帹鑽愪嬌鐢紝鍙屽悜鍏寵仈涓弻鏂歸兘璁劇疆inverse錛漟alse鐨勮瘽錛屽繀浼氬鑷村弻鏂歸兘閲嶅鏇存柊鍚屼竴涓叧緋匯備絾鏄鏋滃弻鏂歸兘璁劇珛inverse錛漷rue鐨勮瘽錛屽弻鏂歸兘涓嶇淮鎶ゅ叧緋葷殑鏇存柊錛岃繖涔熸槸涓嶈鐨勶紝濂藉湪涓瀵瑰涓殑涓绔?many-to-one榛樿鏄痠nverse錛漟alse錛岄伩鍏嶄簡榪欑閿欒鐨勪駭鐢熴備絾鏄澶氬灝辨病鏈夎繖涓粯璁よ緗簡錛屾墍浠ュ緢澶氫漢緇忓父鍦ㄥ瀵瑰鐨勪袱绔兘浣跨敤inverse錛漷rue錛岀粨鏋滃鑷磋繛鎺ヨ〃鐨勬暟鎹牴鏈病鏈夎褰曪紝灝辨槸鍥犱負浠栦滑鍙屽垎閮芥病鏈夎矗浠葷淮鎶ゅ叧緋匯傛墍浠ヨ錛屽弻鍚戝叧鑱斾腑鏈濂界殑璁劇疆鏄竴绔負inverse錛漷rue錛屼竴绔負inverse錛漟alse銆備竴鑸琲nverse錛漟alse浼氭斁鍦ㄥ鐨勪竴绔紝閭d箞鏈変漢鎻愰棶浜嗭紝many錛峵o錛峬any涓よ竟閮芥槸澶氱殑錛宨nverse鍒板簳鏀懼湪鍝効錛熷叾瀹瀐ibernate寤虹珛澶氬澶氬叧緋諱篃鏄皢浠栦滑鍒嗙鎴愪袱涓竴瀵瑰鍏崇郴錛屼腑闂磋繛鎺ヤ竴涓繛鎺ヨ〃銆傛墍浠ラ氱敤瀛樺湪涓瀵瑰鐨勫叧緋伙紝涔熷彲浠ヨ繖鏍瘋錛氫竴瀵瑰鏄瀵瑰鐨勫熀鏈粍鎴愰儴鍒嗐?/p>
鐪嬩笅闈㈢殑澶氬澶氱殑瀹氫箟澶у鏇翠細娓呮鈥濆瀵瑰鈥滀笌鈥滀竴瀵瑰鈥濈殑鍏崇郴錛氬叾涓垜浠敞鎰?lt;many-to-many />鏍囩鐨勭壒鐐瑰氨鐭ラ亾錛屽畠鏄畾涔変簡涓涓瀵瑰鍏崇郴錛岃屼笉鏄?lt;one-to-many/>銆?/p>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
聽"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
聽"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping 聽package="org.hibernate.auction">
聽<class name="TestA" table="TestA"
聽dynamic-update="true" dynamic-insert="true" >
聽聽<id name="id" column="id" type="int" unsaved-value="any" >
聽聽聽<generator class="assigned">
聽聽聽</generator>
聽聽</id>
聽聽<property name="name" type="java.lang.String"
聽聽聽update="true" insert="true" column="name" />
聽聽<set name="testBs" table="TestA_TestB" inverse="false" cascade="all">
聽聽聽<key column="testA"/>
聽聽聽<many-to-many column="testB" class="TestB" />
聽聽</set>
聽</class>
聽<class name="TestB" table="TestB"
聽dynamic-update="true" dynamic-insert="true" >
聽聽<id name="id" column="id" type="int" unsaved-value="any" >
聽聽聽<generator class="assigned">
聽聽聽</generator>
聽聽</id>
聽聽<property name="name" type="java.lang.String" update="true"
聽聽insert="true" column="name" />
聽聽<set name="testAs" table="TestA_TestB" inverse="true" cascade="all">
聽聽聽<key column="testB"/>
聽聽聽<many-to-many column="testA" class="TestA" />
聽聽</set>
聽</class>
</hibernate-mapping>
鍦ㄥ澶氬涓紝鍥犱負涓绔淮鎶ゅ叧緋誨彟涓绔笉緇存姢鍏崇郴鐨勫師鍥狅紝鎴戜滑蹇呴』娉ㄦ剰閬垮厤鍦ㄥ簲鐢ㄤ腑鐢ㄤ笉緇存姢鍏崇郴鐨勭被寤虹珛鍏崇郴錛屽洜涓鴻繖鏍峰緩绔嬬殑鍏崇郴鏄笉浼氬湪鏁版嵁搴撲腑瀛樺偍鐨勩傚熀浜庝笂闈㈢殑鏄犲皠鏂囦歡浠g爜緇欏嚭涓涓緥瀛愶細
package org.hibernate.auction;
import java.util.*;
/**
聽* @author Administrator
聽*
聽* To change the template for this generated type comment go to
聽* Window>Preferences>Java>Code Generation>Code and Comments
聽*/
public class TestA {
聽int id;
聽String name;
聽Set testBs=new HashSet();
聽public TestA(){
聽聽
聽}
聽public TestA(int id){
聽聽setId(id);
聽}
聽public int getId(){
聽聽return id;
聽}
聽public void setId(int id){
聽聽this.id=id;
聽}
聽public String getName(){
聽聽return name;
聽}
聽public void setName(String name){
聽聽this.name=name;
聽}
聽public Set getTestBs(){
聽聽return testBs;
聽}
聽public void setTestBs(Set s){
聽聽testBs=s;
聽}
聽public void addTestB(TestB tb){
聽聽testBs.add(tb);
聽}
聽public static void main(String[] args) {
聽}
}
public class TestB {
聽int id;
聽String name;
聽Set testAs=new HashSet();
聽public TestB(){
聽聽
聽}
聽public TestB(int id){
聽聽setId(id);
聽}
聽public int getId(){
聽聽return id;
聽}
聽public void setId(int id){
聽聽this.id=id;
聽}
聽public String getName(){
聽聽return name;
聽}
聽public void setName(String name){
聽聽this.name=name;
聽}
聽public Set getTestAs(){
聽聽return testAs;
聽}
聽public void setTestAs(Set s){
聽聽testAs=s;
聽}
聽public void addTestA(TestA ta){
聽聽testAs.add(ta);
聽}
聽public static void main(String[] args) {
聽}
}
嫻嬭瘯浠g爜錛?/p>
public void doTest() throws Exception{
聽聽TestA a1=new TestA(1);
聽聽TestA a2=new TestA(2);
聽聽TestA a3=new TestA(3);
聽聽TestB b1=new TestB(1);
聽聽TestB b2=new TestB(2);
聽聽TestB b3=new TestB(3);
聽聽a1.addTestB(b1);
聽聽a1.addTestB(b2);
聽聽a1.addTestB(b3);
聽聽b1.addTestA(a1);
聽聽b2.addTestA(a2);
聽聽
聽聽Session s = factory.openSession();
聽聽
聽聽s = factory.openSession();
聽聽
聽聽
聽聽Session session = factory.openSession();
聽 session.save(a1);
聽 session.flush();
聽 session.close();
聽}
嫻嬭瘯鍚庤繛鎺ヨ〃鐨勬暟鎹負錛?/p>
testa聽聽聽聽聽聽聽聽聽聽聽聽聽 testb
1聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 1
1聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 2
1聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 3
鏍規嵁inverse瑙勫垯錛屽榪欎簺浠g爜錛歜2.addTestA(a1);聽聽b2.addTestA(a2); 寤虹珛鐨勫叧緋伙紝鏁版嵁搴撳茍娌℃湁瀛樺偍涓嬫潵錛屽洜涓篢estB娌℃湁璐d換緇存姢榪欎簺鍏崇郴錛屾墍浠ヤ駭鐢熺殑sql璇彞鑷劧涓嶄細鏈夐拡瀵筎esta_testB琛ㄧ殑鎿嶄綔浜嗐傚亣璁懼簲鐢ㄤ腑鐪熺殑闇瑕佽繖浜涙柟娉曪紝閭d箞鎴戜滑鍙互淇敼TestB鐨勬柟娉曪紝璁╀粬浠敞鎰忓湪緇存姢绔被涓墽琛岀浉搴旂殑鎿嶄綔浠ヤ嬌寰楀叧緋昏兘澶熷湪鏁版嵁搴撲腑淇濆瓨涓嬫潵錛屾洿鏀筎estB濡備笅錛?/p>
/*
聽* Created on 2004-7-25
聽*
聽* To change the template for this generated file go to
聽* Window>Preferences>Java>Code Generation>Code and Comments
聽*/
package org.hibernate.auction;
import java.util.*;
/**
聽* @author Administrator
聽*
聽* To change the template for this generated type comment go to
聽* Window>Preferences>Java>Code Generation>Code and Comments
聽*/
public class TestB {
聽int id;
聽String name;
聽Set testAs=new HashSet();
聽public TestB(){
聽聽
聽}
聽public TestB(int id){
聽聽setId(id);
聽}
聽public int getId(){
聽聽return id;
聽}
聽public void setId(int id){
聽聽this.id=id;
聽}
聽public String getName(){
聽聽return name;
聽}
聽public void setName(String name){
聽聽this.name=name;
聽}
聽public Set getTestAs(){
聽聽return testAs;
聽}
聽public void setTestAs(Set s){
聽聽testAs=s;
聽}
聽public void addTestA(TestA ta){
聽聽testAs.add(ta);
聽聽ta.addTestB(this);
聽}
聽public static void main(String[] args) {
聽}
}
閭d箞嫻嬭瘯鎵ц鍚庤繛鎺ヨ〃鐨勬暟鎹負錛?/p>
testa聽聽聽聽聽聽聽聽聽 testb
1聽聽聽聽聽聽聽聽聽聽聽聽聽聽 2
1聽聽聽聽聽聽聽聽聽聽聽聽聽聽 3
1聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 1
2聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 2
嫻嬭瘯閫氳繃銆?br />
聽
瀵瑰師鐢烻QL鏌ヨ鎵ц鐨勬帶鍒舵槸閫氳繃SQLQuery鎺ュ彛榪涜鐨勶紝閫氳繃鎵цSession.createSQLQuery()鑾峰彇榪欎釜鎺ュ彛銆傛渶綆鍗曠殑鎯呭喌涓嬶紝鎴戜滑鍙互閲囩敤浠ヤ笅褰㈠紡錛?/font>
List cats = sess.createSQLQuery("select * from cats")
.addEntity(Cat.class)
.list();
榪欎釜鏌ヨ鎸囧畾浜?
SQL鏌ヨ瀛楃涓?/font>
鏌ヨ榪斿洖鐨勫疄浣?/font>
榪欓噷錛岀粨鏋滈泦瀛楁鍚嶈鍋囪涓轟笌鏄犲皠鏂囦歡涓寚鏄庣殑瀛楁鍚嶇浉鍚屻傚浜庤繛鎺ヤ簡澶氫釜琛ㄧ殑鏌ヨ錛岃繖灝卞彲鑳介犳垚闂錛屽洜涓哄彲鑳藉湪澶氫釜琛ㄤ腑鍑虹幇鍚屾牱鍚嶅瓧鐨勫瓧孌點備笅闈㈢殑鏂規硶灝卞彲浠ラ伩鍏嶅瓧孌靛悕閲嶅鐨勯棶棰?
List cats = sess.createSQLQuery("select {cat.*} from cats cat")
.addEntity("cat", Cat.class)
.list();
榪欎釜鏌ヨ鎸囧畾浜?
SQL鏌ヨ璇彞錛屽畠甯︿竴涓崰浣嶇錛屽彲浠ヨHibernate浣跨敤瀛楁鐨勫埆鍚?
鏌ヨ榪斿洖鐨勫疄浣擄紝鍜屽畠鐨凷QL琛ㄧ殑鍒悕.
addEntity()鏂規硶灝哠QL琛ㄧ殑鍒悕鍜屽疄浣撶被鑱旂郴璧鋒潵錛屽茍涓旂‘瀹氭煡璇㈢粨鏋滈泦鐨勫艦鎬併?
addJoin()鏂規硶鍙互琚敤浜庤澆鍏ュ叾浠栫殑瀹炰綋鍜岄泦鍚堢殑鍏寵仈.
List cats = sess.createSQLQuery(
"select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
)
.addEntity("cat", Cat.class)
.addJoin("kitten", "cat.kittens")
.list();
鍘熺敓鐨凷QL鏌ヨ鍙兘榪斿洖涓涓畝鍗曠殑鏍囬噺鍊兼垨鑰呬竴涓爣閲忓拰瀹炰綋鐨勭粨鍚堜綋銆?
Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat")
.addScalar("maxWeight", Hibernate.DOUBLE);
.uniqueResult();
闄ゆ涔嬪錛屼綘榪樺彲浠ュ湪浣犵殑hbm鏂囦歡涓弿榪扮粨鏋滈泦鏄犲皠淇℃伅錛屽湪鏌ヨ涓嬌鐢ㄣ?/font>
List cats = sess.createSQLQuery(
"select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
)
.setResultSetMapping("catAndKitten")
.list();
鍙互鍦ㄦ槧灝勬枃妗d腑瀹氫箟鏌ヨ鐨勫悕瀛?鐒跺悗灝卞彲浠ヨ薄璋冪敤涓涓懡鍚嶇殑HQL鏌ヨ涓鏍風洿鎺ヨ皟鐢ㄥ懡鍚峉QL鏌ヨ.鍦ㄨ繖縐嶆儏鍐典笅,鎴戜滑涓?/em> 闇瑕佽皟鐢?tt class="literal">addEntity()鏂規硶.
<sql-query name="persons">
<return alias="person" class="eg.Person"/>
SELECT person.NAME AS {person.name},
person.AGE AS {person.age},
person.SEX AS {person.sex}
FROM PERSON person
WHERE person.NAME LIKE :namePattern
</sql-query>
List people = sess.getNamedQuery("persons")聽 榪欓噷瑕佺壒鍒殑鎻愰啋涓涓嬪ぇ瀹跺崈涓囦笉瑕佹妸涓婚敭蹇樹簡銆傚垰寮濮嬫垜灝卞繕浜嗕富閿紝鍚庢潵璋冭瘯浜嗗崐澶╂墠鎵懼嚭鍘熷洜鏉ャ?br />
.setString("namePattern", namePattern)
.setMaxResults(50)
.list();
鎴戣寰楄繖縐嶅彂寮忔瘮杈冨ソ銆傝繖鏍峰啓鍑烘潵鐨剆ql鍙互寰堟暣榻愩傛垜浠殑鏁版嵁搴撲嬌鐢ㄧ殑鏄痮racle錛屼笉榪囨寜鐓ц繖涓婇潰鐨勫啓娉曞彂鐜皊ql璇彞鏈夐敊璇?br />鍚庢潵鎷垮埌鎺у埗鍙版墽琛屼篃鎶遍敊銆傚洜涓哄師鏉ラ兘鐢╯qlserver錛岃宻qlserver閮芥槸鍙互鐨勩傚悗鏉ュ彂鐜版槸琛ㄤ笉鑳芥湁鍒悕鏀規垚榪欐牱灝卞ソ浜嗐?br />聽聽聽聽聽聽聽聽聽聽聽聽SELECT聽T_PAY.sys_id聽as聽{pay.sysId},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.sys_flag聽as聽{pay.sysFlag},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.sys_domain聽as聽{pay.sysDomain},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.sys_owner聽as聽{pay.sysOwner},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.sys_create_date聽as聽{pay.sysCreateDate},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.sys_update_date聽as聽{pay.sysUpdateDate},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.pay_id聽as聽{pay.payId},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.pay_name聽as聽{pay.payName},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.pay_type_id聽as聽{pay.payTypeId},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.pay_date聽as聽{pay.payDate},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.money_type_id聽as聽{pay.moneyTypeId},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.amount聽as聽{pay.amount},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.payer_id聽as聽{pay.payerId},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.payer_name聽as聽{pay.payerName},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.accept_id聽as聽{pay.acceptId},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.accept_name聽as聽{pay.acceptName},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.pay_state_id聽as聽{pay.payStateId},
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽T_PAY.remark聽as聽{pay.remark}
聽聽聽聽聽聽聽聽聽聽聽聽FROM聽聽聽T_PAY
聽聽聽聽聽聽聽聽聽聽聽聽JOIN聽聽聽T_BIZ_PAY
聽聽聽聽聽聽聽聽聽聽聽聽ON聽聽聽聽聽聽聽T_PAY.pay_id聽=聽T_BIZ_PAY.pay_id
聽聽聽聽聽聽聽聽聽聽聽聽WHERE聽聽T_BIZ_PAY.biz_id聽=聽:bizId
榪欎袱涓槦鏈熶互鏉ワ紝鎴戞妸鍘熸潵鐢╯truts寮鍙戠殑涓涓祴璇曞伐鍏鋒敼鐢╯truts+hibernate鏉ュ疄鐜幫紝棣栧厛浠庡績鎯呬笂鏉ワ紝鏁翠釜寮鍙戣繃紼嬩腑濮嬬粓淇濇寔鎰夊揩鍜屽鉤鍜岋紝鈥滃師鏉ュ紑鍙戝彲浠ヨ繖鏍鋒剦蹇紵鈥濓紝鍐嶄竴鐐瑰氨鏄紑鍙戞晥鐜囦笂楂樻晥浜嗚澶氥?br />聽聽聽聽聽 鐜板湪sun鍙堝姞鍏docentral.com寮濮嬬潃鎵婮DO2.0錛屾兂鎯崇湅絳夊畠鍑哄彴浠ュ悗灝嗘槸涓涓庢牱嬋鍔ㄤ漢蹇冨緱鍦洪潰錛岃鎴戜滑鎷洰浠ュ緟銆?br />聽聽聽聽聽
|
榪戜袱澶╂潵鍦ㄧ爺絀禜ibernate涓殑one-to-one鍜宱ne-to-many鐨勯棶棰橈紝鍋氫簡寰堝璇曢獙錛屽彂鐜板疄鐜拌〃鍏崇郴鏃訛紝鍦╤ibernate-mapping涓璯enerator鐨刢lass璁句負uuid.hex錛屼笂榪扮殑涓ょ鍏崇郴鍙互瀹炵幇錛屼篃灝辨槸鏁版嵁搴撶殑涓婚敭璁句負varchar錛圡SSQL2000錛夛紝浣嗘槸涓婚敭鏀規垚int鍨嬬殑鏍囪瘑鍗村脊鍑衡淓RROR SessionImpl:2379 - Could not synchronize database state with session鈥濆拰鈥渘et.sf.hibernate.HibernateException: SQL insert, update or delete failed (row not found)鈥濆紓甯革紝鐧炬濅笉寰楀叾瑙c備笅闈㈣創鍑轟富閿涓簎uid.hex鏃剁殑瀹炵幇浠g爜錛?br /> package test.pojo; public class Child { 聽聽聽 public String getCid() { 聽聽聽 public void setCid(String cid) { 聽聽聽 public String getCname() { 聽聽聽 public void setCname(String cname) { 聽聽聽 public String getPid() { 聽聽聽 public void setPid(String pid) { 聽聽聽 public Parent getParent() { 聽聽聽 public void setParent(Parent parent) { import java.util.HashSet;
public class Parent {
聽聽聽 public String getPid() {
聽聽聽 public void setPid(String pid) {
聽聽聽 public String getPname() {
聽聽聽 public void setPname(String pname) {
聽聽聽 public java.util.Set getChild() {
聽聽聽 public void setChild(java.util.Set child) {
}
public class TestHibernate {
聽聽聽 public static void main(String[] argv) { |
寰堝浜洪兘瀵笿ava鍦ㄦ壒閲忔暟鎹殑澶勭悊鏂歸潰鏄惁鏄叾鍚堥傜殑鍦烘墍鎸佹湁鎬鐤戠殑蹇靛ご錛岀敱姝ゅ歡浼革紝閭d箞灝變細璁や負ORM鍙兘涔熶笉鏄壒鍒傚悎鏁版嵁鐨勬壒閲忓鐞嗐?鍏跺疄錛屾垜鎯沖鏋滄垜浠簲鐢ㄥ緱褰撶殑璇濓紝瀹屽叏鍙互娑堥櫎ORM鎵歸噺澶勭悊鎬ц兘闂榪欐柟闈㈢殑欏捐檻銆備笅闈互Hibernate涓轟緥鏉ュ仛涓鴻鏄庯紝鍋囧鎴戜滑鐪熺殑涓嶅緱涓嶅湪Java涓嬌鐢℉ibernate鏉ュ鏁版嵁榪涜鎵歸噺澶勭悊鐨勮瘽銆?鍚戞暟鎹簱鎻掑叆100 000鏉℃暟鎹紝鐢℉ibernate鍙兘鍍忚繖鏍鳳細
銆銆澶ф鍦ㄨ繍琛屽埌絎?0 000鏉$殑鏃跺欙紝灝變細鍑虹幇鍐呭瓨婧㈠嚭鑰屽け璐ャ傝繖鏄疕ibernate鎶婃渶榪戞彃鍏ョ殑Customer閮戒互session-level cache鍦ㄥ唴瀛樺仛緙撳瓨錛屾垜浠笉瑕佸繕璁癏iberante騫舵病鏈夐檺鍒秄irst-level cache 鐨勭紦瀛樺ぇ灝忥細 銆銆# 鎸佷箙瀵硅薄瀹炰緥琚鐞嗗湪浜嬪姟緇撴潫鏃訛紝姝ゆ椂Hibernate涓庢暟鎹簱鍚屾浠諱綍宸茬粡鍙戠敓鍙?鍖栫殑琚鐞嗙殑鐨勫璞°?br /> 銆銆# Session瀹炵幇浜嗗紓姝rite-behind錛屽畠鍏佽Hibernate鏄懼紡鍦板啓鎿嶄綔鐨勬壒澶勭悊銆?榪欓噷錛屾垜緇欏嚭Hibernate濡備綍瀹炵幇鎵歸噺鎻掑叆鐨勬柟娉曪細 棣栧厛錛屾垜浠緗竴涓悎鐞嗙殑JDBC鎵瑰鐞嗗ぇ灝忥紝hibernate.jdbc.batch_size 20銆?鐒跺悗鍦ㄤ竴瀹氶棿闅斿Session榪涜flush()鍜宑lear()銆?br />
銆銆閭d箞錛屽叧浜庢庢牱鍒犻櫎鍜屾洿鏂版暟鎹憿錛熼偅濂斤紝鍦℉ibernate2.1.6鎴栬呮洿鍚庣増鏈紝scroll() 榪欎釜鏂規硶灝嗘槸鏈濂界殑閫斿緞錛?br />
銆銆榪欑鍋氭硶騫朵笉鍥伴毦錛屼篃涓嶇畻涓嶄紭闆呫傝娉ㄦ剰錛屽鏋淐ustomer鍚敤浜唖econd-level caching 錛屾垜浠粛鐒朵細鏈変竴浜涘唴瀛樼鐞嗙殑闂銆傚師鍥犲氨鏄浜庣敤鎴風殑姣忎竴嬈℃彃鍏ュ拰鏇存柊錛孒ibernate鍦ㄤ簨鍔″鐞嗙粨鏉熷悗涓嶅緱涓嶉氬憡second-level cache 銆傚洜姝わ紝鎴戜滑鍦ㄦ壒澶勭悊鎯呭喌涓嬪皢瑕佺鐢ㄧ敤鎴蜂嬌鐢ㄧ紦瀛樸?br /> |
鎬ц兘嫻嬭瘯錛?br />聽聽 瀵逛竴涓?036鏉¤褰曠殑琛ㄨ繘琛宭oad嫻嬭瘯錛岃〃瀛楁鏈?涓紝鏈変竴涓瓧孌墊槸text鍨嬶紝姣忔潯璁板綍鐨勮瀛楁綰︽湁1300澶氬瓧鑺傦紝鍏朵綑閮芥槸綆鍗曞瓧孌?br />聽聽 杞‖浠訛細AMD XP1600+, 512M鍐呭瓨錛堟祴璇曟椂鍐呭瓨鏈変綑錛夛紝winXP SP1, JDK1.4.2_06, Mysql4.1.9,InnoDB,GBK, mm.3.1.6椹卞姩錛?tomcat5.0.28錛堝惎鍔ㄨ緗渶澶у唴瀛?56M錛屾渶灝忓唴瀛?4M錛?hibernate2.1.8, 鎵撳紑浜岀駭緙撳瓨Ehcache錛堥厤緗簩綰х紦瀛樻渶澶?0000涓璞★級鍏抽棴鎵鏈塰ibernate log淇℃伅鍜宻ql杈撳嚭
娉ㄦ剰浜嬮」錛?br />聽 (1)涓嶈鍦ㄦ満鍣ㄨ繍琛岃緝闀挎椂闂村悗榪愯tomcat榪涜嫻嬭瘯錛岀壒鍒槸鏈哄櫒鍚姩鍚庨綣佸湴寮鍚痶omcat錛宩ava紼嬪簭錛屾墦寮杈冨ぇ搴旂敤紼嬪簭鍗犵敤寰堝鍐呭瓨鐨勬椂鍊欍傞偅鏃跺欐祴璇曠粨鏋滀竴瀹氫笉鍑嗐傛瘮濡傦細鎴戞槰澶╂櫄涓婃祴璇曞厛鐢ㄦ柟娉?鐨勬椂闂存槸200S錛?0S錛屽悗榪愯鏂規硶2錛岀珶鐒剁敤浜?000S,200S! |