专栏名称: 架构文摘
每天一篇架构领域重磅好文,涉及一线互联网公司的互联网应用架构、大数据、机器学习等各个热门领域。
目录
相关文章推荐
美团技术团队  ·  可信实验白皮书系列04:随机轮转实验 ·  3 天前  
架构师之路  ·  爸爸!除了你,沈括,沈万三... ... ·  4 天前  
51好读  ›  专栏  ›  架构文摘

震惊!从未见过如此简单粗暴的Hibernate教程

架构文摘  · 公众号  · 架构  · 2017-09-28 08:50

正文

请到「今天看啥」查看全文



  • get会立即发送select语句,load不会立刻发送,当使用到该对象的非OID属性时才会发送,延迟加载

  • load方法返回的对象永远不为null,即使在数据库中不存在,所以不能使用if-null的方式来判断,而get可以为null,因为load执行的时候没有发送select语句,所以他不知道数据库中有没有对应数据,所以索性返回一个不为null的对象,如果存在,则再把数据设置到对象中去,如果不存在,使用该对象时报错

  • load方法会创建出代理对象,但是代理对象必须在session关闭之前创建出来,否则会报hibernate中最常见的错误,no session,解决办法为Hibernate.initialize(代理对象)


持久化对象的生命周期


为什么需要关注持久化对象的生命周期?那我们来回忆使用Hibernate中是否遇到的三个问题:


  • 问题一:主键生成策略不同,save操作时发生INSERT语句的时机不同?

    • native:在执行save方法的时候发送INSERT SQL

    • increment:在提交事务的时候,才发送INSERT SQL

  • 问题二:删除对象的时候,没有立刻发生DELETE语句,而是在提交事务的时候发送的。

  • 问题三:为什么在事务环境下,通过get方法得到的对象,只要修改了属性值,会发生UPDATE语句。


那么SQL的执行时机和什么有关系呢?和对象的状态有关系。那持久化对象的状态有哪一些?怎么划分的?


划分的规则::


  • 当前对象是否有OID( 该对象在表中对应有一个id值

  • 对象是否被session所管理( 对象是否在一级缓存中


状态 描述 特点
临时状态/瞬时态(transient) 刚刚用new语句创建,没有被持久化,不处于session中 没有oid,不在session当中
持久化状态(persistent) 已经被持久化,加入到session的缓存中 有oid,在session当中
游离状态(detached)/脱管态 已经被持久化,但不处于session中 有oid,不在session当中
删除状态(removed) 对象有关联的ID,并且在session管理下,但是已经计划被删除 有oid,在session当中,最终的效果是被删除.








请到「今天看啥」查看全文