hiberante學習筆記

1 在maven中配置hibernate時候,只要是版本4.2.4或以上,就只配一個就行,不用再配什麼slf4j之類的

2 @manytoone 和 @onetomany的情況:

一般是在manytoone這方,設置cascade={CascadeType.ALL} 這意味着,多的這方,在保存的時候,也會把一的這方保存。(但是要明確將一設置進多裏)

而在一的這方,onetomany,即便是設置了 cascade={CascadeType.ALL} ,在保存一這方時候,仍然不能保存多。(已經將多明確設置進了一里面)

3 cascade 管 CUD 即 增刪改 。而fetch 管 R ,即讀,也就是load 和 get 。cascade這貨沒有默認值,必須顯式的設。

4 關於fetch

在多的這一方,FetchType默認是EAGER的(這意味着,在get取多的時候,要同時發語句取一),而在一這方,FetchType默認是LAZY的。

默認情況下  --- 測試不通過!

User u = (User)session.get(User.class,1);

session.getTransaction().commit(); --- 事務已經提交,session已經沒有了(應該是用getCurrentSession的情況),但是user 和 group都已經取出放到內存裏了。

u.setName("new value"); -- 內存裏是有u的

u.getGroup().setName("new GROUP"); --內存裏是有GROUP的

session2.update(u); --- 以新session操作 內存裏的值。

session2.getTransaction().commit(); 


如果說,第一句是 

User u = (User)session.load(User.class,1); 這僅僅是放到代理對象裏,還沒有發sql語句的。此時,如果

session.getTransaction().commit(); -

u.setName("new value"); -- 是不行的。


5 關於cascade再深入:CascadeType 裏面的merge persist等 只有在調用 session.merge()和persist 方法時候纔有效的。要注意。


6 關於刪除。假設user 和 group雙方互相設置了CascadeType.ALL ,如果user表

name   group_id

u1         1

u2         1

當你刪除u1的時候,會把u2也刪除。原因是:刪除u1,user cascade着group,也會刪除g1。而group又cascade着user,所以反過來又把u2也刪除了。。

解決的辦法是打破這種關聯關係:

u1.setGroup(null);

session.delete(u1);即可

或者用sql語句

session.createQuery("delete from User u where u.id =1 ").executeUpdate();

------------重要,如果一這方設置了cascadetype.all,則刪除一這方的時候,會一溜的把多這方全部刪除。要想避免這種情況,處理辦法有二,同上。但這樣的話,實際上多的這樣就是垃圾值了。


發佈了10 篇原創文章 · 獲贊 5 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章