• Hibernate中对象的三种状态即save(),update(),saveOrUpdate()的使用【转】


     

    当new一个user的时候,是处于瞬时状态 

    当调用session.save(user)的时候,user对象会放到session里,此时处于持久状态 
    当提交事务的时候,user对象才会存到DB中 
    当调用session.close的时候,user对象会从session中出来,此时处于脱管状态 

    三种状态对象的区别:标准就是与session,与数据库的关系 
    瞬时状态:与session,数据库无关 
    持久状态:在session里,在数据库里,当持久化状态对象发生改变的时候,hibernate会检测到 
    问题一:当调用了session.save(User)后,又调用了user.setName(“张三”),hibernate会自动检测到user对象的变化,问题是,hibernate是何时通知数据库的呢? 
    答案是,在commit的时候。因为他不会根据程序调用一次set,就同步一次数据库,他会尽可能的减少与数据库就交互,会在commit()之前一次性的同步数据库。 
    脱管状态:与session无关,但在数据库里有数据。 
    什么时候用update()? 
    当对象处于脱管状态的要想更新对象则调用update()、 
    当对象处于瞬时状态的时候,则调用save()方法 
    问题是,在写代码的时候,怎么知道状态是处于瞬时和脱管状态呢,一个好的方法是 
    当不知道对象处于什么状态的时候,调用saveOrUpdate方法,让hibernate自己去判断。那么hibernate是怎么判断的呢,他也是根据对象的id或者Version来判断,当id=0的时候,对象处于瞬时状态。当id>0的时候,对象处于脱管状态。那么如果主键是String类型呢,则他会根据是否为Null来判断 

    三种状态的转变及调用什么方法可以转变? 

    通过new可以创建一个瞬时状态的对象 
    通过save()或者saveOrUpdate()把瞬时状态变成持久化状态 
    通过delete()方法把持久化状态变成瞬时状态 
    通过evict()/close()/clear()把持久化状态变成脱管状态 
    通过update()/savaOrUpdate()/lock()方法把脱管状态变成持久化状态 
    通过get()或者load()或者find()或者iterate()等都能取得持久化状态的对象 
    理解这几种状态的含义及使用,是非常有用的,只有明白了,在开发中才知道什么时候用什么方法。 

    -----------------------------------------------华丽分割线-----------------------------------------------

    Hibernate中有两个极为相似的方法get()与load(),他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例,但Hibernate不会搞两个完全一样的方法的,它们间的不同在于:

     1.如果找不到符合条件的纪录,get()方法将返回null.而load()将会报出ObjectNotFoundEcception.

     2.load()方法可以返回实体的代理类实例,而get()永远只返回实体类.

        3.load()方法可以充分利用二级缓存和内部缓存的现有数据,而get()方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用SQL完成查找.

  • 相关阅读:
    c++坐标移动
    c++字串的连接最长路径查找
    c++句子逆序——堆栈实现
    c++句子逆序——substr函数
    c++计数法解决统计不同字符个数
    c++提取不重复的整数-计数
    C++取近似值简单算法
    c++排序去重
    c++计数排序例子
    分布式服务框架 Zookeeper
  • 原文地址:https://www.cnblogs.com/zzt-lovelinlin/p/11353381.html
Copyright © 2020-2023  润新知