Hibenate作為一種Java對象持久化技術在很多大型的多層體系構架中得到應用比如在開發一套電子商務系統可以以JEE作為體系構架Structs作為java Web應用框架以Hibenate實現對象持久化任務以EJB或者普通的javabean實現業務邏輯其實現過程的復雜度可想而知下面收集一些在Hibenate中多對多關系中應用技巧給大家分享
cascade=?
cascade屬性並不是多對多關系一定要用的有了它只是讓我們在插入或刪除對像時更方便一些只要在cascade的源頭上插入或是刪除所有cascade的關系就會被自己動的插入或是刪除便是為了能正確的cascadeunsavedvalue是個很重要的屬性
Hibernate通過這個屬性來判斷一個對象應該save還是update如果這個對象的id是unsavedvalue的話那說明這個對象不是persistence object要save(insert)如果id是非unsavedvalue的話那說明這個對象是persistence object(數據庫中已存在)只要update就行了saveOrUpdate方法用的也是這個機制
inverse=ture?
inverse屬性默認是false的就是說關系的兩端都來維護關系這個意思就是說如有一個Student Teacher和TeacherStudent表Student和Teacher是多對多對多關系這個關系由TeacherStudent這個表來表現那麼什麼時候插入或刪除TeacherStudent表中的記錄來維護關系呢?在用hibernate時我們不會顯示的對TeacherStudent表做操作
對TeacherStudent的操作是hibernate幫我們做的hibernate就是看hbm文件中指定的是誰維護關系那個在插入或刪除誰時就會處發對關系表的操作前提是誰這個對象已經知道這個關系了就是說關系另一頭的對象已經set或是add到誰這個對象裡來了前面說過inverse默認是false就是關系的兩端都維護關系對其中任一個操作都會處發對表系表的操作當在關系的一頭如Student中的bag或set中用了inverse=true時那就代表關系是由另一關維護的(Teacher)就是說當這插入Student時不會操作TeacherStudent表即使Student已經知道了關系只有當Teacher插入或刪除時才會處發對關系表的操作
所以當關系的兩頭都用inverse=true是不對的就會導致任何操作都不處發對關系表的操作當兩端都是inverse=false或是default值是在代碼對關系顯示的維護也是不對的會導致在關系表中插入兩次關系在一對多關系中inverse就更有意義了在多對多中在哪端inverse=true效果差不多(在效率上)但是在一對多中如果要一方維護關系就會使在插入或是刪除一方時去update多方的每一個與這個一的對象有關系的對象
而如果讓多方面維護關系時就不會有update操作因為關系就是在多方的對象中的直指插入或是刪除多方對象就行了當然這時也要遍歷多方的每一個對象顯示的操作修關系的變化體現到DB中不管怎樣說還是讓多方維護關系更直觀一些
cascade和inverse有什麼區別?
可以這樣理解cascade定義的是關系兩端對象到對象的級聯關系而inverse定義的是關系和對象的級聯關系
sfhibernateObjectDeletedException: deleted object would be resaved by cascade (remove deleted object from associations): of class: Xxxxx
這個問題出現在要刪除關系的一頭時如要刪除一個已經和Student有關系的Teacher當mit();時才會拋出這個異常這時一個在關系另一頭的Student對象中的Set或是List中把這個Teacher對象顯示的remove掉再sessiondelete(這個teacher);這是為了防止在Student端有cascade時把這個Teacher對象再存回DB
所以這個異常的只有在Student的關系定義中有cascade=而且沒有像上面說的顯示的解除關系時才會出現所以防止出現這個異常的方法就是在Student端不用cascade或是用cascade的話就顯示的刪除對像中的關系 在Teacher端要用cascade
sfhibernateHibernateException: identifier of an instance of myMyObject altered from N to N
這個異常其實不是多對多中常遇到的但是這個異常的提示不make sense所以提一下是因為id的java對象中的type和hbm文件中定義的不一樣如java中用long而hbm中用type=integer並且generator用的是identity時就會出現
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28437.html