Hibernate学习笔记

1.hibernate数据的三个状态:

hibernate中有个缓存机制,在使用commit方法之前,其会在自己的缓存中保存一份最终需要写入数据库的对象。

  • 1.持久化状态:数据session所管理着,在缓存中保存着一份数据。
  • 2.瞬时状态:数据库中没有该数据,并且session的缓存中没有该数据。
  • 3.离线状态:数据库中有该数据,但是session中的缓存没有该数据。

2.hibernate执行数据库写入

所有的数据库写入操作都是在commit中进行的,

  • 1.当一个数据是瞬时状态,调用save能将其转化为持久化状态。由此操作,commit中会进行一个插入sql语句。
  • 2.load的数据直接就是持久化的,当一个数据是持久化状态。在在commit时,会自动将该数据和缓存中的数据进行比较如果有变化,就会自动执行一条更新sql语句。
  • 3.当一个数据是离线状态,update能将其变成持久化状态。
  • 4.当一个数据是离线状态和持久化状态时,delete能将其变成瞬时状态。
  • 5.saveOrUpdate操作对于一个数据来说:当为离线状态就使用update,当是瞬时状态就会执行save。
  • 6.注意当数据的id已经确定了,那么hibernate会自动认为其是离线状态,即使数据库中没有 这条数据。
  • 7.hibernate的缓存中是根据数据的id来区分是否是相同的数据的,其缓存中不能有两条id相同的数据。merge方法能将后面一条将要变成持久化状态的数据合并到前面的数据中。
  • 8.clear方法能清空hibernate缓存中的数据,最后在commit中不会进行任何操作。
  • 9.总结:对于某一条数据的一整个流程的操作,在commit之前都只是改变session缓存中的数据。最终的sql写入是在commit中进行的。session缓存中数据的索引是由id决定的。
    • 1.对于一条有id的数据来说。
      • 1.进行save操作,会将其变成持久化状态。
        • 1.save后没有再对数据进行操作
          • 1.如果id在数据库中没有,那么commit中会使用插入sql。即之前是瞬时状态
          • 2.如果在数据库中有,那么会报错,因为插入了重复的数据。
        • 2.save后对数据进行了操作:
          • 1.id没改变,数据改变了,在commit中会将数据和缓存的数据进行比较,然后先插入后更新。
          • 2.id,数据没改变,直接插入数据。
          • 3.id改变了,这时无论数据有没有变,都会报错。即数据和缓存中的数据存在某种联系。一般情况下id不可改变
      • 2.进行update操作,会将其变成持久化状态。
        • 1.update后没有在对数据进行操作:
          • 1.id在数据库中没有,那么commit时会报错。因为更新了没有的数据。
          • 2.id在数据库中有,那么会更新数据。即之前是离线状态
        • 2.update后又对数据进行了操作。
            1. id没改变,数据改变了。在commit中会将数据和缓存的数据进行比较,将数据的改变值给缓存的数据,然后将缓存的数据用更新sql写入。注意就算改变后的数据和数据库中的数据是一样的,还是会执行更新sql
          • 2.id,数据没改变,直接更新。
          • 3.id改变,同save会报错。
      • 3.进行delete操作,会将其变成瞬时状态。
        • 1.delete后没对数据进行操作:
          • 1.id在数据库中有,在commit中使用查找和删除sql。
          • 2.id在数据库中没有,在commit中使用查找sql。
        • 2.delete后所有对数据的操作都不会影响到delete操作。
        • 3.delete值对id敏感,也就是说只判断id,其他数据不管。
      • 4.进行load操作,会将其变成持久化状态
        • 1.如果id不存在会报错。
        • 2.load后,由于其已经持久化,所以不能改变id。
        • 3.load后,如果改变了数据,在commit中会进行更新sql。
      • 5.进行saveOrUpdate,会将其变成持久化状态。
        • 1.无论id有没有都不会再报错。有则更新,无则插入。
        • 2.其后续的操作就是save和update的选择。
    • 2.对于没有id的数据来说
      • 1.save,会变成持久化状态,由于一般的表id是自增的,所以会自动加上id,添加一条数据
        • 1.save后不操作数据,commit中只执行插入sql。
        • 2.save后操作数据
          • 1.id变,数据不变。报错,因为id会初始化为0,这时候就和前面一样报错。
          • 2.id不变,数据变。commite中会执行插入和更新sql,但是最后由于找不到id,数据库会回滚。
          • 3.id不变,数据不变。commit中只执行一条插入sql。
      • 2.update:由于没有id所以会报错或者说id=0,找不到数据。
      • 3.delete:无
      • 4.load:无
      • 5.saveOrUpdate:由于id=0,所以最后变成了没有id的save操作。

3.延迟加载

  • 1.load,只执行load的时候,不对结果进行操作,那么就不会操作数据库;即不用对象就不取对象,此时的对象是代理对象,其中只有id。只有获取其他数据的时候,才会去数据库中取。
    • 1.由于load是懒加载,所以如果在操作对象之前,session就已经关闭了的话,那么就会报错。
  • 2.get,和load相反,直接数据库获取对象。

4.多对一(单向)

  • 1.在多的那边加一个一的实体,并在配置文件中配置。
  • 2.当多的这边使用懒加载时,其内部的一也是采用懒加载的策略
  • 3.只有一在已经save或者数据库中有值的时候,多的一方才能关联。

5.一对多(单向)

6.HQL

  • 1.HQL是基于对象查询。from XXX(对象名)
  • 2.from XXX where x like ?(这个在后面链式结构setParamter(0,“%a%”))。从XXX中查询x为a的对象。
  • 3.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值