java之hibernate之 cascade和inverse
1.Cascade是級聯(lián)動作,在many_to_one中如果使用cascade可以級聯(lián)操作關(guān)聯(lián)對象,如下代碼可以級聯(lián)保存Category對象。
在Book的映射文件設(shè)置
<many-to-one name="category" column="cid" cascade="save-update"/>在保存book時,如果book所對應(yīng)的category沒有保存,那么先保存category再保存book,完成級聯(lián)保存數(shù)據(jù)的動作。
Cascade默認(rèn)值是none,不進(jìn)行級聯(lián)動作;
Cascade可以為delete, 在many_to_one中cascade不會設(shè)置為delete,因為可能會造成異常,除非是基于外鍵的一對一。
Cascade還可以為all, all表示可以進(jìn)行所有的級聯(lián)動作。
?
在one_to_many中使用cascade:
<!-- 雙向一對多的設(shè)置 --><set name="books" cascade="save-update"><!-- 設(shè)置外鍵 --><key column="cid"></key><!-- 設(shè)置多的一端的類型 --><one-to-many class="Book"/></set>在保存一端數(shù)據(jù)時,如果發(fā)現(xiàn)關(guān)系對象多端數(shù)據(jù)沒有保存,那么會級聯(lián)保存book; 但是在一端使用級聯(lián)保存,會多出n條更新語句,所以效率比較低。(即如果多的一端未保存,在一的一端使用級聯(lián)保存時,會多出n條更新語句,效率較低;所以這種情況下,推薦在多端使用級聯(lián),而不推薦在一端使用)
?
如果在一端cascade="delete",那么在刪除一端數(shù)據(jù)時,會級聯(lián)將多端的所有數(shù)據(jù)刪除。(慎用)
注意:cascade要起作用,那么一定要設(shè)置關(guān)聯(lián)對象。如果關(guān)聯(lián)對象不存在,那么cascade不會有作用。建議少用cascade,甚至不用。
2. inverse:反轉(zhuǎn), 在hibernate中用于在一的一端來控制關(guān)系(外鍵)由誰來管理(crud)。
<!-- 雙向一對多的設(shè)置 --><set name="books" cascade="save-update" inverse="true"><!-- 設(shè)置外鍵 --><key column="cid"></key><!-- 設(shè)置多的一端的類型 --><one-to-many class="Book"/></set>表示關(guān)系(外鍵)由Book一端來維護(hù)(即多的一端)。也就是說要為book對象設(shè)置好book對象對應(yīng)的Category屬性,外鍵才會被維護(hù)(保存)。
@Testpublic void testInit(){Session session = null;Transaction tx = null;try {session = HibernateUtil.getSession();tx = session.beginTransaction();Category c1 = new Category("計算機類");Category c2 = new Category("文學(xué)");Category c3 = new Category("歷史");SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");Book b1 = new Book("java","sun",30,df.parse("1995-05-23"));b1.setCategory(c1);Book b2 = new Book("struts","apache",40,df.parse("2006-09-12"));b2.setCategory(c1);Book b3 = new Book("明朝那些事兒","當(dāng)年明月",70,df.parse("2008-05-23"));b3.setCategory(c3);Book b4 = new Book("水滸傳","老撕",20,df.parse("1985-05-23"));b4.setCategory(c2);c1.getBooks().add(b1);c1.getBooks().add(b2);c2.getBooks().add(b4);c3.getBooks().add(b3);session.save(c1);session.save(c2);session.save(c3);tx.commit();} catch (Exception e) {if(tx!=null)tx.rollback();}finally {HibernateUtil.close();}}如果 inverse=false ,說明一的一端也可以維護(hù)關(guān)系,也就是說可以通過在一的一端添加多的一端數(shù)據(jù),來保存外鍵關(guān)系。
@Testpublic void testInit(){Session session = null;Transaction tx = null;try {session = HibernateUtil.getSession();tx = session.beginTransaction();Category c1 = new Category("計算機類");Category c2 = new Category("文學(xué)");Category c3 = new Category("歷史");SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");Book b1 = new Book("java","sun",30,df.parse("1995-05-23"));Book b2 = new Book("struts","apache",40,df.parse("2006-09-12"));Book b3 = new Book("明朝那些事兒","當(dāng)年明月",70,df.parse("2008-05-23"));Book b4 = new Book("水滸傳","老撕",20,df.parse("1985-05-23"));c1.getBooks().add(b1);c1.getBooks().add(b2);c2.getBooks().add(b4);c3.getBooks().add(b3);session.save(c1);session.save(c2);session.save(c3);tx.commit();} catch (Exception e) {if(tx!=null)tx.rollback();}finally {HibernateUtil.close();}}但是要通過更新語句來完成。所以一般情況下,inverse=true.
在多的一端沒有inverse, 因為多的一端默認(rèn)可以維護(hù)關(guān)系。
注意:級聯(lián)和 inverse 都是通過關(guān)聯(lián)對象來完成的,如果沒有設(shè)置關(guān)聯(lián)對象,這兩者均不起作用。在兩者都設(shè)置的情況,要注意區(qū)分誰管理級聯(lián),誰管理關(guān)系。有可能一個關(guān)聯(lián)對象既管理關(guān)系又管理級聯(lián)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/Vincent-yuan/p/11210864.html
總結(jié)
以上是生活随笔為你收集整理的java之hibernate之 cascade和inverse的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Several ports (8005,
- 下一篇: 18.28 getchar()函数与缓冲