1到底在哪用cascade=? cascade屬性並不是多對多關系一定要用的
有了它只是讓我們在插入或刪除對像時更方便一些
只要在cascade的源頭上插入或是刪除
所有cascade的關系就會被自己動的插入或是刪除
便是為了能正確的cascade
unsaved
value是個很重要的屬性
Hibernate通過這個屬性來判斷一個對象應該save還是update
如果這個對象的id是unsaved
value的話
那說明這個對象不是persistence object要save(insert)
如果id是非unsaved
value的話
那說明這個對象是persistence object(數據庫中已存在)
只要update就行了
saveOrUpdate方法用的也是這個機制
2到底在哪用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中
不管怎樣說
還是讓
多
方維護關系更直觀一些
3cascade和inverse有什麼區別? 可以這樣理解
cascade定義的是關系兩端對象到對象的級聯關系
而inverse定義的是關系和對象的級聯關系
4netsfhibernateObjectDeletedException: deleted object would be resaved by cascade (remove deleted object from associations): of class: Xxxxx 這個問題出現在要刪除關系的一頭時
如
要刪除一個已經和Student有關系的Teacher
當mit();時才會拋出這個異常
這時一個在關系另一頭的Student對象中的Set或是List中把這個Teacher對象顯示的remove掉
再session
delete(這個teacher);
這是為了防止在Student端有cascade時把這個Teacher對象再存回DB
所以
這個異常的只有在Student的關系定義中有cascade=
而且沒有像上面說的顯示的解除關系時才會出現
所以防止出現這個異常的方法就是
在Student端不用cascade
或是用cascade的話
就顯示的刪除對像中的關系
在Teacher端要用cascade
5netsfhibernateHibernateException: identifier of an instance of myMyObject altered from N to N 這個異常其時不是多對多中常遇到的
但是這個異常的提示不make sense
所以提一下
是因為id的java對象中的type和hbm文件中定義的不一樣
如
java中用long
而hbm中用type=
integer
並且generator用的是identity時就會出現
(To be add) 把hibernate遇到常見異常會一點點加上來的
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28868.html