重学一遍hibernate,查漏补缺,自己还有诸多东西需要学习鸭!
一、one-to-many、many-to-one、many-to-many使用时注意!!!实体类的tostring()方法,避免循环递归调用造成StackOverflowError错误。
二、hibernate中的延迟加载(lazyload)分[属性的延迟加载]和[关系的延迟加载]
one-to-many:Category-to-Product
- 属性的延迟加载:当使用load的方式来获取对象的时候,只有访问了这个对象的属性,hibernate才会到数据库中进行查询。否则不会访问数据库;
ps:get和load的区别,对id不存在的对象处理方式
I. get方式会返回null
II. load方式会抛出异常
Product p1 = (Product) session.load(Product.class, 2);
System.out.println("延迟加载!!!");
System.out.println(p1.getName());//获取name时才访问数据库
- 延迟加载又叫lazyload,在one-many many-many的时候都可以使用关系的延迟加载;
Category c = (Category) session.get(Category.class, 1);
System.out.println(c.getName());
System.out.println("延迟加载!!!");
System.out.println(c.getProducts());//获取products时才会再次查询数据库
System.out.println("结束!!!");
三、hibernate中的级联操作
- 什么是级联? 简单的说,没有配置级联的时候,删除分类,其对应的产品不会被删除。 但是如果配置了恰当的级联,那么删除分类的时候,其对应的产品都会被删除掉。
- 四种级联:
包括上一步说的删除用得级联,级联有4种类型:
all:所有操作都执行级联操作;
none:所有操作都不执行级联操作;
delete:删除时执行级联操作;
save-update:保存和更新时执行级联操作;
级联通常用在one-many和many-to-many上,几乎不用在many-one上。
四、hibernate缓存
- hibernate默认是开启一级缓存的,一级缓存存放在session上
- 二级缓存是在SessionFactory上需要插件,如ehcahe等
五、Hibernate有两种方式获得session,分别是: openSession和getCurrentSession
他们的区别在于
- 获取的是否是同一个session对象
openSession每次都会得到一个新的Session对象
getCurrentSession在同一个线程中,每次都是获取相同的Session对象,但是在不同的线程中获取的是不同的Session对象 - 事务提交的必要性
openSession只有在增加,删除,修改的时候需要事务,查询时不需要的
getCurrentSession是所有操作都必须放在事务中进行,并且提交事务后,session就自动关闭,不能够再进行关闭
六、Hibernate使用乐观锁来处理脏数据问题

网友评论