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,则删除一这方的时候,会一溜的把多这方全部删除。要想避免这种情况,处理办法有二,同上。但这样的话,实际上多的这样就是垃圾值了。