美文网首页
hibernate相关知识(踩过的坑 -_- ...)

hibernate相关知识(踩过的坑 -_- ...)

作者: DKing丶 | 来源:发表于2019-04-12 15:59 被阅读0次

重学一遍hibernate,查漏补缺,自己还有诸多东西需要学习鸭!

一、one-to-many、many-to-one、many-to-many使用时注意!!!实体类的tostring()方法,避免循环递归调用造成StackOverflowError错误。

二、hibernate中的延迟加载(lazyload)分[属性的延迟加载]和[关系的延迟加载]

    one-to-many:Category-to-Product
  1. 属性的延迟加载:当使用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时才访问数据库
  1. 延迟加载又叫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中的级联操作

  1. 什么是级联? 简单的说,没有配置级联的时候,删除分类,其对应的产品不会被删除。 但是如果配置了恰当的级联,那么删除分类的时候,其对应的产品都会被删除掉。
  2. 四种级联:
    包括上一步说的删除用得级联,级联有4种类型:
    all:所有操作都执行级联操作;
    none:所有操作都不执行级联操作;
    delete:删除时执行级联操作;
    save-update:保存和更新时执行级联操作;
    级联通常用在one-many和many-to-many上,几乎不用在many-one上。

四、hibernate缓存

  1. hibernate默认是开启一级缓存的,一级缓存存放在session上
  2. 二级缓存是在SessionFactory上需要插件,如ehcahe等

五、Hibernate有两种方式获得session,分别是: openSession和getCurrentSession

他们的区别在于

  1. 获取的是否是同一个session对象
    openSession每次都会得到一个新的Session对象
    getCurrentSession在同一个线程中,每次都是获取相同的Session对象,但是在不同的线程中获取的是不同的Session对象
  2. 事务提交的必要性
    openSession只有在增加,删除,修改的时候需要事务,查询时不需要的
    getCurrentSession是所有操作都必须放在事务中进行,并且提交事务后,session就自动关闭,不能够再进行关闭

六、Hibernate使用乐观锁来处理脏数据问题

乐观锁原理.png

相关文章

网友评论

      本文标题:hibernate相关知识(踩过的坑 -_- ...)

      本文链接:https://www.haomeiwen.com/subject/kubcwqtx.html