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,則刪除一這方的時候,會一溜的把多這方全部刪除。要想避免這種情況,處理辦法有二,同上。但這樣的話,實際上多的這樣就是垃圾值了。