锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
璁捐涓婂彲浠ョ伒媧葷殑鏍規嵁 Criteria 鐨勭壒鐐規潵鏂逛究鍦拌繘琛屾煡璇㈡潯浠剁殑緇勮銆傜幇鍦ㄥ
Hibernate鐨凜riteria 鐨勭敤娉曡繘琛屾葷粨錛?/font>
Hibernate 璁捐浜?CriteriaSpecification 浣滀負 Criteria 鐨勭埗鎺ュ彛錛屼笅闈㈡彁渚涗簡
Criteria鍜孌etachedCriteria 銆?
Criteria 鍜?DetachedCriteria
鐨勪富瑕佸尯鍒湪浜庡垱寤虹殑褰㈠紡涓嶄竴鏍鳳紝 Criteria 鏄湪綰跨殑錛屾墍
浠ュ畠鏄敱 Hibernate Session 榪涜鍒涘緩鐨勶紱鑰?DetachedCriteria 鏄綰跨殑錛屽垱寤烘椂鏃犻渶
Session錛孌etachedCriteria 鎻愪緵浜?2 涓潤鎬佹柟娉?
forClass(Class) 鎴?forEntityName(Name)
榪涜DetachedCriteria 瀹炰緥鐨勫垱寤恒?Spring
鐨勬鏋舵彁渚涗簡getHibernateTemplate
().findByCriteria(detachedCriteria) 鏂規硶鍙互寰堟柟渚垮湴鏍規嵁DetachedCriteria
鏉ヨ繑鍥炴煡璇㈢粨
鏋溿?
Criteria 鍜?DetachedCriteria 鍧囧彲浣跨敤 Criterion 鍜?Projection 璁劇疆鏌ヨ鏉′歡銆傚彲浠ヨ
緗?FetchMode( 鑱斿悎鏌ヨ鎶撳彇鐨勬ā寮?) 錛岃緗帓搴忔柟寮忋傚浜?
Criteria 榪樺彲浠ヨ緗?FlushModel
錛堝啿鍒?Session 鐨勬柟寮忥級鍜?LockMode 錛堟暟鎹簱閿佹ā寮忥級銆?
涓嬮潰瀵?Criterion 鍜?Projection 榪涜璇︾粏璇存槑銆?/font>
Criterion 鏄?Criteria
鐨勬煡璇㈡潯浠躲侰riteria 鎻愪緵浜?add(Criterion criterion) 鏂規硶鏉?/font>
娣誨姞鏌ヨ鏉′歡銆?br />
Criterion 鎺ュ彛鐨勪富瑕佸疄鐜板寘鎷細
Example 銆?Junction 鍜?SimpleExpression 銆傝?
Junction 鐨勫疄闄呬嬌鐢ㄦ槸瀹冪殑涓や釜瀛愮被 conjunction 鍜?disjunction
錛屽垎鍒槸浣跨敤 AND 鍜?OR 鎿?/font>
浣滅榪涜鏉ヨ仈
緇撴煡璇㈡潯浠墮泦鍚堛?br />
Criterion 鐨勫疄渚嬪彲浠ラ氳繃 Restrictions 宸ュ叿綾繪潵鍒涘緩錛孯estrictions
鎻愪緵浜嗗ぇ閲忕殑闈欐?/font>
鏂規硶錛屽 eq 錛堢瓑浜庯級銆?
ge 錛堝ぇ浜庣瓑浜庯級銆?between 絳夋潵鏂規硶鐨勫垱寤?Criterion 鏌ヨ鏉′歡
錛圫impleExpression 瀹炰緥錛夈傞櫎姝や箣澶栵紝 Restrictions 榪樻彁渚涗簡鏂規硶鏉ュ垱寤?
conjunction 鍜?
disjunction
瀹炰緥錛岄氳繃寰璇ュ疄渚嬬殑 add(Criteria) 鏂規硶鏉ュ鍔犳煡璇㈡潯浠跺艦鎴愪竴涓煡璇㈡潯浠墮泦鍚?/font>
銆?br />
鑷充簬 Example 鐨勫垱寤烘湁鎵涓嶅悓錛?Example
鏈韓鎻愪緵浜嗕竴涓潤鎬佹柟娉?create(Object
entity) 錛屽嵆鏍規嵁涓涓璞★紙瀹為檯浣跨敤涓竴鑸槸鏄犲皠鍒版暟鎹簱鐨勫璞★級鏉ュ垱寤恒傜劧鍚庡彲浠ヨ緗竴浜?/font>
榪囨護鏉′歡錛?
Example exampleUser
=Example.create(u)
.ignoreCase() // 蹇界暐澶у皬鍐?
.enableLike(MatchMode.ANYWHERE);
// 瀵?String 綾誨瀷鐨勫睘鎬э紝鏃犺鍦ㄩ偅閲屽煎湪閭i噷閮藉尮閰嶃傜浉褰撲簬 %value%
Project 涓昏鏄 Criteria
鑳藉榪涜鎶ヨ〃鏌ヨ錛屽茍鍙互瀹炵幇鍒嗙粍銆?Project 涓昏鏈?
SimpleProjection 銆?ProjectionList 鍜?Property 涓変釜瀹炵幇銆傚叾涓?
SimpleProjection 鍜?
ProjectionList
鐨勫疄渚嬪寲鏄敱鍐呭緩鐨?Projections 鏉ュ畬鎴愶紝濡傛彁渚涚殑 avg 銆?count 銆?max 銆?
min 銆?sum 鍙互璁╁紑鍙戣呭緢瀹規槗瀵規煇涓瓧孌佃繘琛岀粺璁℃煡璇€?
Property 鏄鏌愪釜瀛楁榪涜鏌ヨ鏉′歡鐨勮緗紝濡傞氳繃Porperty.forName(“color”).in
(new String[]{“black”,”red”,”write”});
鍒欏彲浠ュ垱寤轟竴涓?Project 瀹炰緥銆傞氳繃
criteria
鐨?add(Project) 鏂規硶鍔犲叆鍒版煡璇㈡潯浠朵腑鍘匯?
浣跨敤 Criteria 榪涜鏌ヨ錛屼富瑕佽娓呮櫚鐨勬槸 Hibernate 鎻愪緵浜嗛偅浜涚被鍜屾柟娉曟潵婊¤凍寮鍙戜腑鏌?/font>
璇㈡潯浠剁殑鍒涘緩鍜岀粍瑁咃紝涓嬮潰浠嬬粛鍑犵鐢ㄦ硶錛?/font>
1. 鍒涘緩涓涓狢riteria 瀹炰緥
org.hibernate.Criteria
鎺ュ彛琛ㄧず鐗瑰畾鎸佷箙綾葷殑涓涓煡璇€係ession鏄?Criteria瀹炰緥鐨勫伐鍘傘?br />
Criteria crit =
sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats =
crit.list();
2. 闄愬埗緇撴灉闆嗗唴瀹?br />
涓涓崟鐙殑鏌ヨ鏉′歡鏄?
org.hibernate.criterion.Criterion 鎺ュ彛鐨勪竴涓疄渚嬨?/font>
org.hibernate.criterion.Restrictions綾?
瀹氫箟浜嗚幏寰楁煇浜涘唴緗瓹riterion綾誨瀷鐨勫伐鍘傛柟娉曘?br />
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.add(
Restrictions.between("weight", minWeight, maxWeight) )
.list();
綰︽潫鍙互鎸夐昏緫鍒嗙粍銆?
List cats =
sess.createCriteria(Cat.class)
.add( Restrictions.like("name",
"Fritz%") )
.add( Restrictions.or(
Restrictions.eq(
"age", new Integer(0) ),
Restrictions.isNull("age")
) )
.list();
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )
.add( Restrictions.disjunction()
.add(
Restrictions.isNull("age") )
.add( Restrictions.eq("age", new
Integer(0) ) )
.add( Restrictions.eq("age", new Integer(1) )
)
.add( Restrictions.eq("age", new Integer(2) ) )
) )
.list();
Hibernate鎻愪緵浜嗙浉褰撳鐨勫唴緗甤riterion綾誨瀷(Restrictions 瀛愮被),
浣嗘槸灝ゅ叾鏈夌敤鐨勬槸鍙互鍏佽
浣犵洿鎺ヤ嬌鐢?
SQL銆?br />
List cats = sess.createCriteria(Cat.class)
.add(
Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%",
Hibernate.STRING) )
.list();
{alias}
鍗犱綅絎﹀簲褰撹鏇挎崲涓鴻鏌ヨ瀹炰綋鐨勫垪鍒悕銆?
Property瀹炰緥鏄幏寰椾竴涓潯浠剁殑鍙﹀涓縐嶉斿緞銆備綘鍙互閫氳繃璋冪敤
Property.forName() 鍒涘緩涓涓?/font>
Property銆?
Property age = Property.forName("age");
List
cats = sess.createCriteria(Cat.class)
.add(
Restrictions.disjunction()
.add( age.isNull() )
.add( age.eq( new Integer(0) ) )
.add( age.eq( new Integer(1)
) )
.add( age.eq( new Integer(2) ) )
) )
.add(
Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )
.list();
3. 緇撴灉闆嗘帓搴?br />
浣犲彲浠ヤ嬌鐢╫rg.hibernate.criterion.Order鏉ヤ負鏌ヨ緇撴灉鎺?
搴忋?
List cats = sess.createCriteria(Cat.class)
.add(
Restrictions.like("name", "F%")
.addOrder( Order.asc("name") )
.addOrder( Order.desc("age") )
.setMaxResults(50)
.list();
List cats = sess.createCriteria(Cat.class)
.add(
Property.forName("name").like("F%") )
.addOrder(
Property.forName("name").asc() )
.addOrder(
Property.forName("age").desc() )
.setMaxResults(50)
.list();
4. 鍏寵仈
浣犲彲浠ヤ嬌鐢╟reateCriteria()闈炲父瀹規槗鐨勫湪浜掔浉鍏寵仈鐨勫疄浣撻棿寤虹珛 綰︽潫銆?br />
List
cats = sess.createCriteria(Cat.class)
.add(
Restrictions.like("name", "F%")
.createCriteria("kittens")
.add( Restrictions.like("name", "F%")
.list();
娉ㄦ剰絎簩涓?createCriteria()榪斿洖涓涓柊鐨?
Criteria瀹炰緥錛岃瀹炰緥寮曠敤kittens 闆嗗悎涓殑鍏冪礌銆?
鎺ヤ笅鏉ワ紝鏇挎崲褰㈡佸湪鏌愪簺鎯呭喌涓嬩篃鏄緢鏈夌敤鐨勩?br />
List
cats = sess.createCriteria(Cat.class)
.createAlias("kittens",
"kt")
.createAlias("mate", "mt")
.add(
Restrictions.eqProperty("kt.name", "mt.name") )
.list();
(createAlias()騫朵笉鍒涘緩涓涓柊鐨?Criteria瀹炰緥銆?
Cat瀹炰緥鎵淇濆瓨鐨勪箣鍓嶄袱嬈℃煡璇㈡墍榪斿洖鐨刱ittens闆嗗悎鏄?娌℃湁琚潯浠墮榪囨護鐨勩傚鏋滀綘甯屾湜鍙幏寰?/font>
絎﹀悎鏉′歡鐨刱ittens錛?浣犲繀欏諱嬌鐢╮eturnMaps()銆?
List
cats = sess.createCriteria(Cat.class)
.createCriteria("kittens",
"kt")
.add( Restrictions.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext() )
{
Map map = (Map) iter.next();
Cat cat = (Cat)
map.get(Criteria.ROOT_ALIAS);
Cat kitten = (Cat) map.get("kt");
}
5. 鍔ㄦ佸叧鑱旀姄鍙?br />
浣犲彲浠ヤ嬌鐢╯etFetchMode()鍦ㄨ繍琛屾椂瀹氫箟鍔?
鎬佸叧鑱旀姄鍙栫殑璇箟銆?
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.setFetchMode("mate",
FetchMode.EAGER)
.setFetchMode("kittens", FetchMode.EAGER)
.list();
榪欎釜鏌ヨ鍙互閫氳繃澶栬繛鎺ユ姄鍙杕ate鍜宬ittens銆?br />
6. 鏌ヨ紺轟緥
org.hibernate.criterion.Example
綾誨厑璁鎬綘閫氳繃涓涓粰瀹氬疄渚?鏋勫緩涓涓潯浠舵煡璇€?br />
Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List
results = session.createCriteria(Cat.class)
.add(
Example.create(cat) )
.list();
鐗堟湰灞炴с佹爣璇嗙鍜屽叧鑱旇蹇界暐銆傞粯璁ゆ儏鍐典笅鍊間負null鐨勫睘鎬у皢琚帓闄ゃ?
鍙互鑷璋冩暣
Example浣夸箣鏇村疄鐢ㄣ?
Example example = Example.create(cat)
.excludeZeroes() //exclude zero valued properties
.excludeProperty("color") //exclude the property named "color"
.ignoreCase() //perform case insensitive string comparisons
.enableLike(); //use like for string comparisons
List
results = session.createCriteria(Cat.class)
.add(example)
.list();
鐢氳嚦鍙互浣跨敤
examples鍦ㄥ叧鑱斿璞′笂鏀劇疆鏉′歡銆?br />
List results =
session.createCriteria(Cat.class)
.add( Example.create(cat) )
.createCriteria("mate")
.add( Example.create( cat.getMate() )
)
.list();
7.
鎶曞獎(Projections)銆佽仛鍚堬紙aggregation錛夊拰鍒嗙粍錛坓rouping錛?br />
org.hibernate.criterion.Projections
鏄?Projection 鐨勫疄渚嬪伐鍘傘傛垜浠氳繃璋冪敤
setProjection()搴旂敤鎶曞獎鍒頒竴涓煡璇€?
List results =
session.createCriteria(Cat.class)
.setProjection(
Projections.rowCount() )
.add( Restrictions.eq("color",
Color.BLACK) )
.list();
List results =
session.createCriteria(Cat.class)
.setProjection(
Projections.projectionList()
.add( Projections.rowCount() )
.add( Projections.avg("weight") )
.add(
Projections.max("weight") )
.add(
Projections.groupProperty("color") )
)
.list();
顥ヮ棩
鍦ㄤ竴涓潯浠舵煡璇腑娌℃湁蹇呰鏄懼紡鐨勪嬌鐢?"group
by" 銆傛煇浜涙姇褰辯被鍨嬪氨鏄瀹氫箟涓?鍒嗙粍鎶曞獎錛屼粬
浠篃鍑虹幇鍦⊿QL鐨刧roup by瀛愬彞涓?
鍙互閫夋嫨鎶婁竴涓埆鍚嶆寚媧劇粰涓涓姇褰憋紝榪欐牱鍙互浣挎姇褰卞艱綰︽潫鎴栨帓搴忔墍寮曠敤銆備笅闈㈡槸涓ょ涓嶅悓鐨?/font>
瀹炵幇鏂瑰紡錛?br />
List results =
session.createCriteria(Cat.class)
.setProjection(
Projections.alias( Projections.groupProperty("color"), "colr" ) )
.addOrder( Order.asc("colr") )
.list();
顥ヮ棩
List results =
session.createCriteria(Cat.class)
.setProjection(
Projections.groupProperty("color").as("colr") )
.addOrder(
Order.asc("colr") )
.list();
alias()鍜宎s()鏂規硶綆渚跨殑灝嗕竴涓姇褰卞疄渚嬪寘瑁呭埌鍙?
澶栦竴涓?鍒悕鐨凱rojection瀹炰緥涓傜畝鑰岃█涔嬶紝
褰撲綘娣誨姞涓涓姇褰卞埌涓涓姇褰卞垪琛ㄤ腑鏃?浣犲彲浠ヤ負瀹冩寚瀹氫竴涓埆鍚嶏細
List results =
session.createCriteria(Cat.class)
.setProjection(
Projections.projectionList()
.add( Projections.rowCount(),
"catCountByColor" )
.add( Projections.avg("weight"),
"avgWeight" )
.add( Projections.max("weight"), "maxWeight" )
.add( Projections.groupProperty("color"), "color" )
)
.addOrder( Order.desc("catCountByColor") )
.addOrder(
Order.desc("avgWeight") )
.list();
List results =
session.createCriteria(Domestic.class, "cat")
.createAlias("kittens", "kit")
.setProjection(
Projections.projectionList()
.add(
Projections.property("cat.name"), "catName" )
.add(
Projections.property("kit.name"), "kitName" )
)
.addOrder(
Order.asc("catName") )
.addOrder( Order.asc("kitName") )
.list();
涔熷彲浠ヤ嬌鐢?
Property.forName()鏉ヨ〃紺烘姇褰憋細
List results =
session.createCriteria(Cat.class)
.setProjection(
Property.forName("name") )
.add(
Property.forName("color").eq(Color.BLACK) )
.list();
List results =
session.createCriteria(Cat.class)
.setProjection(
Projections.projectionList()
.add(
Projections.rowCount().as("catCountByColor") )
.add(
Property.forName("weight").avg().as("avgWeight") )
.add(
Property.forName("weight").max().as("maxWeight") )
.add(
Property.forName("color").group().as("color" )
)
.addOrder( Order.desc("catCountByColor") )
.addOrder(
Order.desc("avgWeight") )
.list();
8. 紱葷嚎(detached)鏌ヨ鍜屽瓙鏌ヨ
DetachedCriteria
綾諱嬌浣犲湪涓涓猻ession鑼冨洿涔嬪鍒涘緩涓涓煡璇紝騫朵笖鍙互浣跨敤浠繪剰鐨?Session鏉?/font>
鎵ц瀹冦?br />
DetachedCriteria query =
DetachedCriteria.forClass(Cat.class)
.add(
Property.forName("sex").eq('F') );
//鍒涘緩涓涓猄ession
Session session =
.;
Transaction txn = session.beginTransaction();
List results =
query.getExecutableCriteria(session).setMaxResults(100).list();
txn.commit();
session.close();
DetachedCriteria涔熷彲浠ョ敤浠ヨ〃紺哄瓙鏌ヨ銆傛潯浠跺疄渚嬪寘鍚瓙鏌?
璇㈠彲浠ラ氳繃 Subqueries鎴栬?/font>
Property
鑾峰緱銆?br />
DetachedCriteria avgWeight =
DetachedCriteria.forClass(Cat.class)
.setProjection(
Property.forName("weight").avg() );
session.createCriteria(Cat.class)
.add( Property.forName("weight).gt(avgWeight) )
.list();
DetachedCriteria weights =
DetachedCriteria.forClass(Cat.class)
.setProjection(
Property.forName("weight") );
session.createCriteria(Cat.class)
.add( Subqueries.geAll("weight", weights) )
.list();
鐩鎬簰鍏寵仈鐨勫瓙鏌ヨ涔熸槸鏈夊彲鑳界殑錛?br />
DetachedCriteria
avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")
.setProjection( Property.forName("weight").avg() )
.add(
Property.forName("cat2.sex").eqProperty("cat.sex") );
session.createCriteria(Cat.class,
"cat")
.add( Property.forName("weight).gt(avgWeightForSex) )
.list();
]]>
鎴戝啓鐨刪ql涓猴細
from Department as d where d.employees.name='Tom';
榪愯鏃跺嚭鐜板紓甯革細org.hibernate.QueryException: illegal attempt to dereference collection
鏄洜涓猴細鍦ㄤ笂闈㈢殑HQL璇彞 涓紝Department鐨勫叧鑱斿疄浣揺mployees鏄竴涓泦鍚堬紝鑰屼笉鐩存帴鏄竴涓狤mployee瀹炰綋銆?/p>
鍦? Hibernate3.2.2浠ュ墠鐨勭増鏈紝Hibernate浼氬鍏寵仈瀹炰綋鑷姩浣跨敤闅愬紡鐨刬nner join錛?/p>
涔熷氨鏄濡備笅SQL璇彞 涓嶄細鏈変換浣曢棶棰?nbsp;:from Department as d where d.employees.name='Tom';
浠? Hibernate3.2.3浠ュ悗錛孒ibernate鏀瑰彉浜嗚繖縐嶉殣寮忕殑inner join鐨勭瓥鐣?
瀵逛簬濡備笅榪欐潯璇彞錛?/p>
from Department as d where d.employees.name='Tom';
濡傛灉employees鏄櫘閫氱粍浠跺睘 鎬э紝鎴栧崟涓殑鍏寵仈瀹炰綋錛屽垯Hibernate浼氳嚜鍔ㄧ敓鎴愰殣寮忕殑inner join
濡傛灉myEvents鏄篃涓涓泦鍚堬紝閭d箞瀵逛笉璧鳳紒緋?
緇熷皢浼氬嚭鐜?org.hibernate.QueryException: illegal attempt to dereference
collection寮傚父銆?br />
鎹瓾ibernate瀹樻柟璇存硶:
榪欐牱鍙互璁╄繖浣垮緱闅愬惈鍏寵仈鏇村叿紜畾鎬э紙鍘熸枃錛歍his makes
implicit joins more deterministic 錛夈?/p>
鎺ㄨ崘榪欐牱鍐欙細
from Department as d inner join fetch d.employees e where e.name='Tom';鍦ㄥ墠涓綃囨棩蹇椾腑鑷姩鐢熸垚hibernate閰嶇疆鏂囦歡鐨勬椂鍊欙紝浼氬湪dao灞傜敤鍒癵etSession()鏂規硶鏉ユ搷浣滄暟鎹簱璁板綍錛屼絾鏄粬榪樻湁涓柟娉昰etHibernateTemplate()錛岃繖涓や釜鏂規硶絀剁珶鏈変粈涔堝尯鍒憿錛?/p>
1.浣跨敤getSession()鏂規硶浣犲彧瑕佺戶鎵縮essionFactory錛岃屼嬌鐢╣etHibernateTemplate()鏂規硶蹇呴』緇ф壙 HibernateDaoSupport褰撶劧鍖呮嫭sessionFactory錛岃繖鐐瑰尯鍒兘涓嶆槸鐗瑰埆閲嶈鐨勶紝涓嬮潰榪欎簺鍖哄埆灝卞緢閲嶈浜?/p>
2.getSession()鏂規硶鏄病鏈夌粡榪噑pring鍖呰鐨勶紝spring浼氭妸鏈鍘熷鐨剆ession緇欎綘錛屽湪浣跨敤瀹屼箣鍚庡繀欏昏嚜宸辮皟鐢ㄧ浉搴旂殑 close鏂規硶錛岃屼笖涔熶笉浼氬澹版槑寮忎簨鍔¤繘琛岀浉搴旂殑綆$悊錛屼竴鏃︽病鏈夊強鏃跺叧闂繛鎺ワ紝灝變細瀵艱嚧鏁版嵁搴撹繛鎺ユ睜鐨勮繛鎺ユ暟婧? 鍑猴紝getHibernateTemplate()鏂規硶鏄粡榪噑pring灝佽鐨勶紝渚嬪娣誨姞鐩稿簲鐨勫0鏄庡紡浜嬪姟綆$悊錛岀敱spring綆$悊鐩稿簲鐨勮繛鎺ャ?/p>
鍦ㄥ疄闄呯殑浣跨敤榪囩▼涓彂鐜扮殑紜甮etHibernateTemplate()姣攇etSession()鏂規硶瑕佸ソ寰堝錛屼絾鏄湁浜涙柟娉曞湪getHibernateTemplate()騫舵病鏈夋彁渚涳紝榪欐椂鎴戜滑鐢℉ibernateCallback 鍥炶皟鐨勬柟娉曠鐞嗘暟鎹簱.
渚嬪濡備笅浠g爜錛?/p>
/**
* 浣跨敤 hql 璇彞榪涜鎿嶄綔
* @param hql HSQL 鏌ヨ璇彞錛堜嬌鐢ㄥ洖璋冨嚱鏁拌闂閮ㄥ彉閲忥紝蹇呴』鏄痜inal鐨勶級
* @param offset 寮濮嬪彇鏁版嵁鐨勪笅鏍?br />
* @param length 璇誨彇鏁版嵁璁板綍鏁?br />
* @return List 緇撴灉闆?br />
*/
public List getListForPage ( final String hql , final int offset , final int length ) {
List list = getHibernateTemplate().executeFind ( new HibernateCallback ( ) {
public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
Query query = session.createQuery ( hql ) ;
query.setFirstResult ( offset ) ;
query.setMaxResults ( length ) ;
List list = query.list ( ) ;
return list ;
}
}) ;
return list ;
}
閬囧埌榪欑閿欒錛屼竴鑸槸鍥犱負騫跺彂榪囧ぇ寮曡搗鐨勩?/p>
鏌ヨ瑙e喅鏂規硶:
鏌ョ湅涓涓嬫暟鎹簱鐜版湁鐨勮繘紼嬫暟錛屾槸鍚﹀凡緇忚揪鍒板弬鏁皃rocesses鐨勫ぇ灝忋?/p>
1.select count(*) from v$process; 鍙栧緱鏁版嵁搴撶洰鍓嶇殑榪涚▼鏁般?br /> 2.select value from v$parameter where name = 'processes'; 鍙栧緱榪涚▼鏁扮殑涓婇檺銆?br /> 3.濡傚凡杈懼埌涓婇檺錛屼慨鏀筰nitSID.ora涓殑processes鐨勫ぇ灝忋?br /> 4.閲嶆柊鍚姩鏁版嵁搴撳埌nomount鐘舵佷笅錛屾墽琛宑reate spfile from pfile; 騫秙tartup open銆?/p>
鏌ヨ鏁版嵁搴撹嚜鍚姩浠ユ潵鏈澶х殑騫跺彂鏁伴噺
select * from v$license
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param><!-- 鍜?spring 涓殑sesssionfactory ID 涓鑷?-->
</filter>
<filter-mapping><filter-name>hibernateFilter</filter-name><url-pattern>*.do</url-pattern><!-- *.jsp, *.do--></filter-mapping>
Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
榪欐椂鍊欏啀鍘葷綉涓婃壘瑙e喅鏂規, 浼氭湁浜鴻: 鎶婂弬鏁?singleSession鏀逛負false, 灝辮浜? 涓嶈繃, 鏀瑰畬鍚? 浼拌涓嶄箙灝變細閬囧埌鍙︿竴涓儊闂風殑寮傚父:
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
榪欎笅瀹屼簡, 涓や釜鏂規閮戒笉琛? 鍒板簳鎬庝箞鍔? 榪樺ソ, 鍦?a title="http://xuliangyong.javaeye.com/blog/144818" >http://xuliangyong.javaeye.com/blog/144818鐨勪富欏典笂, 緇欎簡涓涓柟妗? 灝辨槸鏀瑰啓 OpenSessionInViewFilter 鐨勪唬鐮? 闈炲父鎰熻阿, 涓嬮潰緇欏嚭鐨勫氨鏄渶緇堟柟妗?
web.xml
< filter-name >hibernateFilter</filter-name>
< filter-class > org.springframework.orm.hibernate3.support.OurOpenSessionInViewFilter </filter-class>
OurOpenSessionInViewFilter.java 浠g爜:
package org.springframework.orm.hibernate3.support;
import org.hibernate.*;
/** * 鍗晄ession妯″紡涓? 榛樿浼氬彂鐢熸棤娉曟彁浜ょ殑閿欒: * Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition. * 闇瑕佽緗瓼lushMode騫跺埛鏂皊ession. * 鍙傝? http://xuliangyong.javaeye.com/blog/144818 * @author 鍒橀暱鐐?/span> */publicclass OurOpenSessionInViewFilter extends OpenSessionInViewFilter {
public OurOpenSessionInViewFilter() {
super.setFlushMode(FlushMode.AUTO);
}
protectedvoid closeSession(Session session, SessionFactory sessionFactory) {
session.flush();
try {
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block//e.printStackTrace();
}
super.closeSession(session, sessionFactory);
}
}
濡傛灉鍚勪綅鏈夋洿濂界殑瑙e喅鏂規, 嬈㈣繋璁ㄨ鍝?!!
棰樺璇?
鎰熻 Spring + Hibernate 鐨勫仴澹ц繕鏄笉澶熷晩! 瀹規槗鎶涘紓甯? 榪欐槸浜嬪疄, 涔熻榪欐槸寮婧愯蔣浠剁殑閫氱梾鍚?
About a year and an half ago I wrote an entry about the problem that rises when mapping an entity with multiple bags using eager fetching. At the end of the entry I suggested three different solutions: (a) to use lazy fetching, (b) to use sets instead of bags, and (c) to use the @IndexColumn annotation. Few months later I elaborated on the usage of @IndexColumn, this time another way – using the @CollectionId annotation.
Environment
· Hibernate Entity Manager – 3.3.1.GA
· Hibernate core – 3.2.5.GA
· Hibernate annotations- 3.3.0.GA
· Database – PostgreSQL 8.1
Just before we start a warning – the @CollectionId annotation is a Hibernate specific annotation – not a part of the specification. And it doesn't work on one-to-many associations (but it can be used in conjunction with one-to-many associations). After putting that behind of us lets see the problem.
Assume the following entities relation, a parent entity has two collections of child entities. Both collections should be eagerly loaded.
First try will be to just to map it as is (Child1 has a many-to-many association; Child2 has a one-to-many):
@ManyToMany( fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinTable(name = "PARENT_CHILD1",
joinColumns = @JoinColumn(name = "PARENT_ID", referencedColumnName = "ID"),
inverseJoinColumns = @JoinColumn(name = "CHILD1_ID", referencedColumnName = "ID"))
List<Child1> child1s = new LinkedList<Child1>();
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
List<Child2> child2s = new LinkedList<Child2>();
But when loading a persistence unit with the above configuration the "org.hibernate.HibernateException: cannot simultaneously fetch multiple bags" will be thrown.
The reason is that when we add the @CollectionId to a List or a Collection its semantics changes from "just a bag" to "a bag with primary key" (a.k.a, idbag). It means that a surrogate key is assigned to each row on the collection
When transforming the association to Child1 into an idbag (using the @CollectionId annotation) the problem is solved. The reason is that when we switch the association semantics from "a simple bag" to "a bag with primary key" (a.k.a, idbag) it means that a surrogate key is assigned to each row on the collection.
@Entity
public class Parent {
………
@ManyToMany( fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinTable(name = "PARENT_CHILD1",
joinColumns = @JoinColumn(name = "PARENT_ID", referencedColumnName = "ID"),
inverseJoinColumns = @JoinColumn(name = "CHILD1_ID", referencedColumnName = "ID"))
@GenericGenerator(name="uuid-gen", strategy = "uuid")
@CollectionId(columns = @Column(name = "COL_ID"), type = @Type(type = "string"), generator = "uuid-gen")List<Child1> child1s = new LinkedList<Child1>();
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
List<Child2> child2s = new LinkedList<Child2>();
}
The problem with bags is that when Hibernate eagerly loads multiple collections it issues an outer join select to the RDBMS which can cause multiple entries on some of the collections. But when using an idbag each row in the collections is uniquely identified by the surrogate key, therefore Hibernate can identify it within the collection, even if the SQL statement returns an entry more than once.
Notice the usage of a generator assigned to the collection id, the generator is responsible for creating the surrogate keys of the collection rows. I decided to use the UUID strategy. You can, of course, use JPA standard generators (such as Sequence or Table generators). The @CollectionId references the COL_ID column on PARENT_CHILD1 table (the join table). The value of the collection id is invisible to the application (it is not being mapped to a property).
The Hibernate annotations documentation says that to announce idbag semantics you should assign the @CollectionId to a @ManyToMany, @CollectionOfElements, or @OneToMany (look at the table on this section), but the Hibernate core documentation it says "Hibernate provides a feature that allows you to map many to many associations and collections of values to a table with a surrogate key." (here). I've tried it and indeed when annotating a @OneToMany collection with the @CollectionId an exception with the message "one-to-many collections with identifiers are not supported " is thrown by Hibernate.
Don't forge that you can use idbag for reasons other than solving multiple eager associations. For example it can give a major performance boost over simple bags for mutative operations. If entries in a collection have surrogate keys Hibernate will be able to locate the matching rows in the database using these keys (each row in the association table becomes unique) – there is no need for the fetch -> delete-all -> insert-all cycle when updating the collection.
Posted at 03:49PM Jan 18, 2008 by Eyal Lupu in Persistence | Comments[6]
Posted by Emmanuel Bernard on January 21, 2008 at 09:33 PM GMT+02:00 #
Posted by Eyal Lupu on January 21, 2008 at 11:56 PM GMT+02:00 #
Posted by Geoffrey De Smet on January 23, 2008 at 11:11 AM GMT+02:00 #
Posted by Eyal Lupu on January 23, 2008 at 11:59 AM GMT+02:00 #
Posted by Emmanuel Bernard on January 23, 2008 at 04:48 PM GMT+02:00 #
Posted by Bartosz Jakubowski on October 22, 2008 at 01:26 PM GMT+02:00 #
get鍜宭oad鏂瑰紡鏄牴鎹甶d鍙栧緱涓涓褰?
涓嬭竟璇︾粏璇翠竴涓媑et鍜宭oad鐨勪笉鍚岋紝鍥犱負鏈変簺鏃跺欎負浜嗗姣斾篃浼氭妸find鍔犺繘鏉ャ?
1.浠庤繑鍥炵粨鏋滀笂瀵規瘮錛?
load鏂瑰紡媯绱笉鍒扮殑璇濅細鎶涘嚭org.hibernate.ObjectNotFoundException寮傚父
get鏂規硶媯绱笉鍒扮殑璇濅細榪斿洖null
2.浠庢绱㈡墽琛屾満鍒朵笂瀵規瘮錛?
get鏂規硶鍜宖ind鏂規硶閮芥槸鐩存帴浠庢暟鎹簱涓绱?
鑰宭oad鏂規硶鐨勬墽琛屽垯姣旇緝澶嶆潅
鈻?棣栧厛鏌ユ壘session鐨刾ersistent Context涓槸鍚︽湁緙撳瓨錛屽鏋滄湁鍒欑洿鎺ヨ繑鍥?
鈻?濡傛灉娌℃湁鍒欏垽鏂槸鍚︽槸lazy錛屽鏋滀笉鏄洿鎺ヨ闂暟鎹簱媯绱紝鏌ュ埌璁板綍榪斿洖錛屾煡涓嶅埌鎶涘嚭寮傚父
鈻?濡傛灉鏄痩azy鍒欓渶瑕佸緩绔嬩唬鐞嗗璞★紝瀵硅薄鐨刬nitialized灞炴т負false錛宼arget灞炴т負null
鈻?鍦ㄨ闂幏寰楃殑浠g悊瀵硅薄鐨勫睘鎬ф椂,媯绱㈡暟鎹簱錛屽鏋滄壘鍒拌褰曞垯鎶婅璁板綍鐨勫璞″鍒跺埌浠g悊瀵硅薄鐨則arget涓婏紝騫跺皢initialized=true錛屽鏋滄壘涓嶅埌灝辨姏鍑哄紓甯?銆?
3.鏍規湰鍖哄埆璇存槑
鈻? 濡傛灉浣犱嬌鐢╨oad鏂規硶錛宧ibernate璁や負璇d瀵瑰簲鐨勫璞★紙鏁版嵁搴撹褰曪級鍦ㄦ暟鎹簱涓槸涓瀹氬瓨鍦ㄧ殑錛屾墍浠ュ畠鍙互鏀懼績鐨勪嬌鐢紝瀹冨彲浠ユ斁蹇冪殑浣跨敤浠g悊鏉? 寤惰繜鍔犺澆璇ュ璞°傚湪鐢ㄥ埌瀵硅薄涓殑鍏朵粬灞炴ф暟鎹椂鎵嶆煡璇㈡暟鎹簱錛屼絾鏄竾涓鏁版嵁搴撲腑涓嶅瓨鍦ㄨ璁板綍錛岄偅娌″姙娉曪紝鍙兘鎶涘紓甯搞傛墍璇寸殑load鏂規硶鎶涘紓甯告槸鎸囧湪浣跨敤 璇ュ璞$殑鏁版嵁鏃訛紝鏁版嵁搴撲腑涓嶅瓨鍦ㄨ鏁版嵁鏃舵姏寮傚父錛岃屼笉鏄湪鍒涘緩榪欎釜瀵硅薄鏃?娉ㄦ剰錛氳繖灝辨槸鐢變簬“寤惰繜鍔犺澆”鍦ㄤ綔鎬?銆?
鐢變簬session涓殑緙撳瓨瀵逛簬hibernate鏉ヨ鏄釜鐩稿綋寤変環鐨勮祫婧愶紝鎵浠ュ湪load鏃朵細鍏堟煡涓涓媠ession緙撳瓨鐪嬬湅璇d瀵瑰簲鐨勫璞℃槸鍚﹀瓨鍦紝涓嶅瓨鍦ㄥ垯鍒涘緩浠g悊銆傛墍浠ュ鏋滀綘鐭ラ亾璇d鍦ㄦ暟鎹簱涓竴瀹氭湁瀵瑰簲璁板綍瀛樺湪灝卞彲浠ヤ嬌鐢╨oad鏂規硶鏉ュ疄鐜板歡榪熷姞杞姐?
鈻?瀵逛簬get鏂規硶錛宧ibernate浼氱‘璁や竴涓嬭id瀵瑰簲鐨勬暟鎹槸鍚﹀瓨鍦紝棣栧厛鍦╯ession緙撳瓨涓煡鎵撅紝鐒跺悗鍦ㄤ簩綰х紦瀛樹腑鏌ユ壘錛岃繕娌℃湁灝辨煡鏁版嵁搴擄紝鏁版嵁搴撲腑娌℃湁灝辮繑鍥瀗ull銆?
瀵逛簬load鍜実et鏂規硶榪斿洖綾誨瀷錛氳櫧鐒跺ソ澶氫功涓兘榪欎箞璇達細“get()姘歌繙鍙繑鍥炲疄浣? 綾?#8221;錛屼絾瀹為檯涓婅繖鏄笉姝g‘鐨勶紝get鏂規硶濡傛灉鍦? session緙撳瓨涓壘鍒頒簡璇d瀵瑰簲鐨勫璞★紝濡傛灉鍒氬ソ璇ュ璞″墠闈㈡槸琚唬鐞嗚繃鐨勶紝濡傝load鏂規硶浣跨敤榪囷紝鎴栬呰鍏朵粬鍏寵仈瀵硅薄寤惰繜鍔犺澆榪囷紝閭d箞榪斿洖鐨勮繕鏄? 鍘熷厛鐨勪唬鐞嗗璞★紝鑰屼笉鏄疄浣撶被瀵硅薄錛屽鏋滆浠g悊瀵硅薄榪樻病鏈夊姞杞藉疄浣撴暟鎹紙灝辨槸id浠ュ鐨勫叾浠栧睘鎬ф暟鎹級錛岄偅涔堝畠浼氭煡璇簩綰х紦瀛樻垨鑰呮暟鎹簱鏉ュ姞杞芥暟鎹紝浣嗘槸 榪斿洖鐨勮繕鏄唬鐞嗗璞★紝鍙笉榪囧凡緇忓姞杞戒簡瀹炰綋鏁版嵁銆?
get鏂規硶棣栧厛鏌ヨsession緙撳瓨錛屾病鏈夌殑璇濇煡璇簩綰х紦瀛橈紝鏈鍚庢煡璇㈡暟鎹簱錛涘弽鑰宭oad鏂規硶鍒涘緩鏃墮鍏堟煡璇ession緙撳瓨錛屾病鏈夊氨鍒涘緩浠g悊錛屽疄闄呬嬌鐢ㄦ暟鎹椂鎵嶆煡璇簩綰х紦瀛樺拰鏁版嵁搴撱?
4.綆鍗曟葷粨
鎬諱箣瀵逛簬get鍜宭oad鐨勬牴鏈尯鍒紝涓鍙ヨ瘽錛宧ibernate瀵逛簬load鏂規硶璁や負璇ユ暟鎹湪鏁版嵁搴撲腑涓瀹氬瓨鍦紝鍙互鏀懼績鐨勪嬌鐢ㄤ唬鐞嗘潵寤惰繜鍔犺澆錛屽鏋滃湪浣跨敤榪囩▼涓彂鐜頒簡闂錛屽彧鑳芥姏寮傚父錛涜屽浜巊et鏂規硶錛宧ibernate涓瀹氳鑾峰彇鍒扮湡瀹炵殑鏁版嵁錛屽惁鍒欒繑鍥瀗ull銆?/p>
鏂囩珷鍑哄錛?a >http://www.diybl.com/course/3_program/java/javajs/2008531/118292.html
hibernate鐨勫悇縐嶄繚瀛樻柟寮忕殑鍖?save,persist,update,saveOrUpdte,merge,flush,lock)鍙?瀵硅薄鐨勪笁縐嶇姸鎬?/p>
hibernate鐨勪繚瀛?/p>
hibernate瀵逛簬瀵硅薄鐨勪繚瀛樻彁渚涗簡澶鐨勬柟娉曪紝浠栦滑涔嬮棿鏈夊緢澶氫笉鍚岋紝榪欓噷緇嗚涓涓嬶紝浠ヤ究鍖哄埆銆?/p>
涓銆侀澶囩煡璇?/p>
瀵逛簬hibernate錛屽畠鐨勫璞℃湁涓夌鐘舵侊紝transient銆乸ersistent銆乨etached
涓嬭竟鏄父瑙佺殑緲昏瘧鍔炴硶錛?/p>
transient錛氱灛鎬佹垨鑰呰嚜鐢辨?/p>
(new DeptPo(1,”琛屾斂閮?#8221;,20,”琛屾斂鐩稿叧”)錛岃po鐨勫疄渚嬪拰session娌℃湁鍏寵仈錛岃po鐨勫疄渚嬪浜巘ransient)
persistent錛氭寔涔呭寲鐘舵?/p>
(鍜屾暟鎹簱涓褰曟兂褰卞皠鐨凱o瀹炰緥錛屽畠鐨勭姸鎬佹槸persistent, 閫氳繃get鍜宭oad絳夊緱鍒扮殑瀵硅薄閮芥槸persistent)
detached錛氳劚綆$姸鎬佹垨鑰呮父紱繪?/p>
(1)褰撻氳繃get鎴杔oad鏂規硶寰楀埌鐨刾o瀵硅薄瀹冧滑閮藉浜巔ersistent,浣嗗鏋滄墽 琛宒elete(po)鏃?浣嗕笉鑳芥墽琛屼簨鍔?,璇o鐘舵佸氨澶勪簬detached, (琛ㄧず鍜宻ession鑴辯鍏寵仈),鍥燿elete鑰屽彉鎴愭父紱繪佸彲浠ラ氳繃save鎴杝aveOrUpdate()鍙樻垚鎸佷箙鎬?/p>
(2)褰撴妸session鍏抽棴鏃訛紝session緙撳瓨涓殑persistent鐨刾o瀵硅薄涔熷彉鎴恉etached
鍥犲叧闂璼ession鑰屽彉鎴愭父紱繪佺殑鍙互閫氳繃lock銆乻ave銆乽pdate鍙樻垚鎸佷箙鎬?/p>
鎸佷箙鎬佸疄渚嬪彲浠ラ氳繃璋冪敤 delete()鍙樻垚鑴辯鐘舵併?/p>
閫氳繃get()鎴杔oad()鏂規硶寰楀埌鐨勫疄渚嬮兘鏄寔涔呭寲鐘舵佺殑銆?/p>
鑴辯鐘舵佺殑瀹炰緥鍙互閫氳繃璋冪敤lock()鎴栬卹eplicate()榪涜鎸佷箙鍖栥?/p>
save()鍜宲ersist()灝嗕細寮曞彂SQL鐨処NSERT錛宒elete()浼氬紩鍙慡QLDELETE錛?/p>
鑰寀pdate()鎴杕erge()浼氬紩鍙慡QL UPDATE銆傚鎸佷箙鍖栵紙persistent錛夊疄渚嬬殑淇敼鍦ㄥ埛鏂版彁浜ょ殑鏃跺欎細琚嫻嬪埌錛屽畠涔熶細寮曡搗SQL UPDATE銆?/p>
saveOrUpdate()鎴栬卹eplicate()浼氬紩鍙慡QLINSERT鎴栬匲PDATE
浜屻乻ave 鍜寀pdate鍖哄埆
鎶婅繖涓瀵規斁鍦ㄧ涓浣嶇殑鍘熷洜鏄洜涓鴻繖涓瀵規槸鏈甯哥敤鐨勩?/p>
save鐨勪綔鐢ㄦ槸鎶婁竴涓柊鐨勫璞′繚瀛?/p>
update鏄妸涓涓劚綆$姸鎬佺殑瀵硅薄鎴栬嚜鐢辨佸璞★紙涓瀹氳鍜屼竴涓褰曞搴旓級鏇存柊鍒版暟鎹簱
涓夈乽pdate 鍜宻aveOrUpdate鍖哄埆
榪欎釜鏄瘮杈冨ソ鐞嗚В鐨勶紝欏懼悕鎬濅箟錛宻aveOrUpdate鍩烘湰涓婂氨鏄悎鎴愪簡save鍜寀pdate,鑰寀pdate鍙槸update;寮曠敤hibernate reference涓殑涓孌佃瘽鏉ヨВ閲婁粬浠殑浣跨敤鍦哄悎鍜屽尯鍒?/p>
閫氬父涓嬮潰鐨勫満鏅細浣跨敤update()鎴杝aveOrUpdate()錛?
紼嬪簭鍦ㄧ涓涓猻ession涓姞杞藉璞?鎺ョ潃鎶妔ession鍏抽棴
璇ュ璞¤浼犻掑埌琛ㄧ幇灞?
瀵硅薄鍙戠敓浜嗕竴浜涙敼鍔?
璇ュ璞¤榪斿洖鍒頒笟鍔¢昏緫灞傛渶緇堝埌鎸佷箙灞?
紼嬪簭鍒涘緩絎簩session璋冪敤絎簩涓猻ession鐨剈pdate()鏂規硶鎸佷箙榪欎簺鏀瑰姩
saveOrUpdate(po)鍋氫笅闈㈢殑浜?
濡傛灉璇o瀵硅薄宸茬粡鍦ㄦ湰session涓寔涔呭寲浜嗭紝鍦ㄦ湰session涓墽琛宻aveOrUpdate涓嶅仛浠諱綍浜?
濡傛灉savaOrUpdate(鏂皃o)涓庡彟涓涓笌鏈瑂ession鍏寵仈鐨刾o瀵硅薄鎷ユ湁鐩稿悓鐨勬寔涔呭寲鏍囪瘑(identifier)錛屾姏鍑轟竴涓紓甯?
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.itfuture.www.po.Xtyhb#5]
saveOrUpdate濡傛灉瀵硅薄娌℃湁鎸佷箙鍖栨爣璇?identifier)灞炴э紝瀵瑰叾璋冪敤save() 錛屽惁鍒檜pdate() 榪欎釜瀵硅薄
鍥涖乸ersist鍜宻ave鍖哄埆
榪欎釜鏄渶榪風鐨勪竴瀵癸紝琛ㄩ潰涓婄湅璧鋒潵浣跨敤鍝釜閮借錛屽湪hibernate reference鏂囨。涓篃娌℃湁鏄庣‘鐨勫尯鍒嗕粬浠?
榪欓噷緇欏嚭涓涓槑紜殑鍖哄垎銆傦紙鍙互璺熻繘src鐪嬩竴涓嬶紝铏界劧瀹炵幇姝ラ綾諱技錛屼絾鏄繕鏄湁緇嗗井鐨勫樊鍒級
涓昏鍐呭鍖哄埆錛?/p>
1錛宲ersist鎶婁竴涓灛鎬佺殑瀹炰緥鎸佷箙鍖栵紝浣嗘槸騫?涓嶄繚璇?鏍囪瘑絎?identifier涓婚敭瀵瑰簲鐨勫睘鎬?琚珛鍒誨~鍏ュ埌鎸佷箙鍖栧疄渚嬩腑錛屾爣璇嗙鐨勫~鍏ュ彲鑳借鎺ㄨ繜鍒癴lush鐨勬椂鍊欍?/p>
2錛宻ave, 鎶婁竴涓灛鎬佺殑瀹炰緥鎸佷箙鍖栨爣璇嗙錛屽強鏃剁殑浜х敓,瀹冭榪斿洖鏍囪瘑絎︼紝鎵浠ュ畠浼氱珛鍗蟲墽琛孲ql insert
浜斻乻aveOrUpdate,merge鍜寀pdate鍖哄埆
姣旇緝update鍜宮erge
update鐨勪綔鐢ㄤ笂杈硅浜嗭紝榪欓噷璇翠竴涓媘erge鐨?/p>
濡傛灉session涓瓨鍦ㄧ浉鍚屾寔涔呭寲鏍囪瘑(identifier)鐨勫疄渚嬶紝鐢ㄧ敤鎴風粰鍑虹殑瀵硅薄瑕嗙洊session宸叉湁鐨勬寔涔呭疄渚?
(1)褰撴垜浠嬌鐢╱pdate鐨勬椂鍊欙紝鎵ц瀹屾垚鍚庯紝浼氭姏鍑哄紓甯?
(2)浣嗗綋鎴戜滑浣跨敤merge鐨勬椂鍊欙紝鎶婂鐞嗚嚜鐢辨佺殑po瀵硅薄A鐨勫睘鎬opy鍒皊ession褰撲腑澶勪簬鎸佷箙鎬佺殑po鐨勫睘鎬т腑錛屾墽琛屽畬鎴愬悗鍘熸潵鏄寔涔呯姸鎬佽繕鏄寔涔呮侊紝鑰屾垜浠彁渚涚殑A榪樻槸鑷敱鎬?/p>
鍏乫lush鍜寀pdate鍖哄埆
榪欎袱涓殑鍖哄埆濂界悊瑙?/p>
update鎿嶄綔鐨勬槸鍦ㄨ嚜鐢辨佹垨鑴辯鐘舵?鍥爏ession鐨勫叧闂屽浜庤劚綆$姸鎬?鐨勫璞?/updateSQL
鑰宖lush鏄搷浣滅殑鍦ㄦ寔涔呯姸鎬佺殑瀵硅薄銆?/p>
榛樿鎯呭喌涓嬶紝涓涓寔涔呯姸鎬佺殑瀵硅薄鐨勬敼鍔紙鍖呭惈set瀹瑰櫒錛夋槸涓嶉渶瑕乽pdate鐨勶紝鍙浣犳洿鏀逛簡瀵硅薄鐨勫鹼紝絳夊緟hibernate flush灝辮嚜鍔ㄦ洿鏂版垨淇濆瓨鍒版暟鎹簱浜嗐俬ibernate flush鍙戠敓鍦ㄤ互涓嬪嚑縐嶆儏鍐典腑錛?/p>
1錛?璋冪敤鏌愪簺鏌ヨ鐨勫拰鎵嬪姩flush(),session鐨勫叧闂丼essionFactory鍏抽棴緇撳悎
get()涓涓璞★紝鎶婂璞$殑灞炴ц繘琛屾敼鍙?鎶婅祫婧愬叧闂?/p>
2錛宼ransaction commit鐨勬椂鍊欙紙鍖呭惈浜唂lush錛?/p>
涓冦乴ock鍜寀pdate鍖哄埆
update鏄妸涓涓凡緇忔洿鏀硅繃鐨勮劚綆$姸鎬佺殑瀵硅薄鍙樻垚鎸佷箙鐘舵?/p>
lock鏄妸涓涓病鏈夋洿鏀硅繃鐨勮劚綆$姸鎬佺殑瀵硅薄鍙樻垚鎸佷箙鐘舵?閽堝鐨勬槸鍥燬ession鐨勫叧闂屽浜庤劚綆$姸鎬佺殑po瀵硅薄(2)錛屼笉鑳介拡瀵瑰洜delete鑰屽浜庤劚綆$姸鎬佺殑po瀵硅薄)
瀵瑰簲鏇存敼涓涓褰曠殑鍐呭錛屼袱涓殑鎿嶄綔涓嶅悓錛?/p>
update鐨勬搷浣滄楠ゆ槸錛?/p>
(1)灞炴ф敼鍔ㄥ悗鐨勮劚綆$殑瀵硅薄鐨勪慨鏀?>璋冪敤update
lock鐨勬搷浣滄楠ゆ槸錛?/p>
(2)璋冪敤lock鎶婃湭淇敼鐨勫璞′粠鑴辯鐘舵佸彉鎴愭寔涔呯姸鎬?->鏇存敼鎸佷箙鐘舵佺殑瀵硅薄鐨勫唴瀹?->絳夊緟flush鎴栬呮墜鍔╢lush
鍏乧lear鍜宔vcit鐨勫尯鍒?/p>
clear瀹屾暣鐨勬竻闄ession緙撳瓨
evcit(obj)鎶婃煇涓寔涔呭寲瀵硅薄浠巗ession鐨勭紦瀛樹腑娓呯┖銆?/p>
@Entity
@Table(name = "customer")
public class CustomerEO implements java.io.Serializable {
……
private CustomerType type;
@Enumerated(EnumType.STRING)
public CustomerType getType() {
return type;
}
public void setType(CustomerType type) {
this.type = type;
}
public enum CustomerType {
COMPETITOR, INVESTOR, PARTNER, VENDER
}
}
鍦ㄥ疄浣撲腑铏界劧鏍囨敞鎴愭灇涓劇被鍨嬶紝浣嗗綋瀹炰綋鎸佷箙鍖栧悗錛岃〃涓墍瀵瑰簲鐨勫間粛鏃ф槸鍩烘湰鐨勬暟鎹被鍨嬶紝浠ヤ笂浠g爜鍒涘緩琛ㄧ殑SQL璇彞鏄細
CREATE TABLE customer (
id int(20) NOT NULL auto_increment,
name varchar(255),
type varchar(255),
PRIMARY KEY (id)
)
浣跨敤鏋氫婦綾誨瀷鍚庯紝鍦ㄥ垱寤哄疄浣撴椂渚垮彲浠ョ洿鎺ュ紩鐢ㄦ灇涓劇被鍨嬶紝渚嬪浠ヤ笅浠g爜鎵紺恒?/font>
CustomerEO customer = new CustomerEO();
customer.setName("Janet2");
customer.setType(CustomerType.PARTNER);
entityManager.persist(customer);
鍦ㄤ嬌鐢?/span>@Enumerated娉ㄩ噴鏃訛紝闇瑕佹敞鎰忎互涓嬪嚑涓棶棰橈細
l 鍥犱負鏋氫婦綾誨瀷鐨勬湁鍚嶇О鍜屽間袱涓睘鎬э紝鎵浠ュ湪鎸佷箙鍖栨椂鍙互閫夋嫨鎸佷箙鍖栧悕縐版垨鏄寔涔呭寲鍊箋傞氳繃EnumType鏉ュ畾涔夛紝瀹冩湁涓や釜鍊煎涓嬫墍紺恒?/span>
public enum EnumType {
ORDINAL,
STRING
}
ORDINAL琛ㄧず鎸佷箙鍖栫殑涓烘灇涓劇被鍨嬬殑鍊鹼紝STRING琛ㄧず鎸佷箙鍖栫殑涓烘灇涓劇被鍨嬬殑鍚嶇О銆傞粯璁や負ORDINAL錛屾寔涔呭寲鍊箋備緥濡備互涓婄ず渚嬩腑鏍囨敞鐨勪負STRING錛岃繖鏍鋒寔涔呭寲瀹炰綋鍚庯紝鏁版嵁搴撲腑淇濆瓨鐨勬槸鏋氫婦綾誨瀷鐨勫悕縐幫紝濡傚浘鎵紺恒?/span>
鑻ユ鏃舵敼鎴?/span>ORDINAL錛屼唬鐮佸涓嬶細
@Enumerated(EnumType.ORDINAL)
public CustomerType getType() {
return type;
}
鍒欏悓鏍鋒寔涔呭寲鐨勫疄浣撳悗錛屾暟鎹簱淇濆瓨鐨勭粨鏋滃鍥?/span>鎵紺恒?/span>
l 濡備綍閫夋嫨STRING鍜?/span>ORDINAL錛?/span>
濡傛灉浣跨敤STRING淇濆瓨錛岃櫧鐒朵粠鏁版嵁搴撲腑鏌ヨ鏁版嵁鏃墮潪甯哥洿瑙傦紝鑳藉娓呮鐨勭湅鍑鴻綾誨瀷浠h〃鎰忎箟錛屼絾榪欐牱涔熶細甯︽潵鍏朵粬鐨勯棶棰樸傝嫢姝ゆ椂鏋氫婦綾誨瀷鐨勫畾涔夋敼鍙橈紝渚嬪涓婁緥涓殑鏋氫婦綾誨瀷鍚嶇О鏀逛負錛?/span>
public enum CustomerType {
CUST_COMPETITOR, INVESTOR, PARTNER, VENDER
}
鍒欐鏃舵暟鎹簱涓繚瀛樼殑“COMPETITOR”鐨勫煎皢涓嶈兘杞寲涓烘灇涓劇被鍨?/span>CustomerType涓殑“CUST_COMPETITOR”鐨勫箋備絾鑻ヤ嬌鐢?/span>ORDINAL鍒欎笉浼氬甫鏉ヨ繖縐嶉棶棰樸傛墍浠ュ緩璁嬌鐢?/span>ORDINAL綾誨瀷鏉ユ寔涔呭寲鏋氫婦綾誨瀷銆?/span>
l 鏋氫婦綾誨瀷鐨勫畾涔変綅緗紝瀹炰綋澶栭儴VS瀹炰綋鍐呴儴銆?/span>
涓婁緥涓?/span>CustomerType鏋氫婦綾誨瀷瀹氫箟鍦?/span>CustomerEO瀹炰綋鍐呴儴錛岃繖鏄洜涓哄彧鏈?/span>CustomerEO榪欎釜瀹炰綋浼氫嬌鐢?/span>CustomerType綾誨瀷錛屽叾浠栫殑瀹炰綋涓嶄細浣跨敤璇ョ被鍨嬨傝綾誨瀷涓庤繖涓疄浣撳叧緋葷揣瀵嗚仈緋匯?/span>
浣嗚嫢姝ゆ椂澶氫釜瀹炰綋鍏敤涓涓灇涓劇被鍨嬫椂錛屽垯鍙互灝嗘灇涓劇被鍨嬪崟鐙畾涔夛紝瀹氫箟鍦ㄥ疄浣撶殑澶栭儴銆傛湁榪欐牱涓涓灇涓劇被鍨?/span>BusinessLine錛屽畠瀹氫箟鍦ㄥ疄浣撳閮紝浠g爜濡備笅錛?/span>
public enum BusinessLine {
REAL_ESTATE,FINANCE, NON_PROFIT
}
渚嬪CustomerEO瀹炰綋澧炲姞涓涓?/span>BusinessLine鐨勬灇涓劇被鍨嬶紝浠g爜濡備笅鎵紺恒?/span>
@Entity
@Table(name = "customer")
public class CustomerEO implements java.io.Serializable {
……
private BusinessLine businessLine;
@Enumerated(EnumType.STRING)
public BusinessLine getBusinessLine() {
return businessLine;
}
public void setBusinessLine(BusinessLine businessLine) {
this.businessLine = businessLine;
}
}
We want a collection field belonging to an entity object to be sorted.
There are two possible solutions:
OrderBy
annotation where you set the actual ORDER BY
SQL clause. In that case, the collection can be of any type (e.g. Collection
).If you want the collection to be sorted at all times, make it of type SortedSet
or SortedMap
and set the Sort
annotation.
Comparable
set type to SortType.NATURAL
.SortType.COMPARATOR
and specify your own Comparator
class in the comparator
attribute.OrderBy
in both the javax.persistence
package as well as the org.hibernate.annotations
package. The former should be used.