1. 站在持久化的角度 , Hibernate 把对象分为 4 种状态 : 持久化状态, 暂时状态, 游离状态(脱管状态) , 删除状态.Session 的特定方法能使对象从一个状态转换到还有一个状态 .

2. 暂时状态(Transient) :
    1). 在使用代理主键的情况下 , OID 通常为 null
    2). 不处于 Session 的缓存中
    3). 在数据库中没有相应的记录

3. 持久化状态(也叫”托管” )( Persist)

    1).
OID 不为 null
    2). 位于 Session 缓存中
    3). 若在数据库中已经有和其相应的记录 , 持久化对象和数据库中的相关记录相应
    4).
Session 在 flush 缓存时 , 会依据持久化对象的属性变化 , 来同步更新数据库
    5). 在同一个 Session 实例的缓存中 , 数据库表中的每条记录仅仅相应唯一的持久化对象( Session 缓存对象的 OID 不能反复)

    @Test
    public void testOID(){
        News news2 = (News ) session.get (News.class , 1);
        System.out.println (news2 );
    
        News news = new
News ();
        news.setAuthor ("Oracle2" );
        news.setContent ("Oracle
DB" );
        news.setDate (new
Date ());
        news.setTitle ("DB" );
        news.setId ();
    
         //抛出异常: org.hibernate.NonUniqueObjectException
        session.update (news );
    }

4. 游离状态(也叫”脱管” ) (Detached ):
    1).
OID 不为 null
    2). 不再处于 Session 缓存中
    3). 普通情况需下 , 游离对象是由持久化对象转变过来的 , 因此在数据库中可能还存在与它相应的记录

5. 删除状态(Removed)
    1). 在数据库中没有和其 OID 相应的记录
    2). 不再处于 Session 缓存中
    3). 普通情况下 , 应用程序不该再使用被删除的对象

6. 状态的转换图

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgzNDA3MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

7. get & load 的差别:
    共同点:
    get、load 从数据表中载入一个对象 , 载入后即为持久化状态的对象
    不同点:
    get: 马上查询数据表. 若没有相应的记录 , 返回 null ;
    load: 延迟查询数据表 . 直到第一次使用该对象时 , 再进行查询,
    先返回的是一个代理对象 . 若没有相应的记录 ,而且使用了该对象 , 则会抛出org.hibernate.ObjectNotFoundException 异常


8. update 方法:

    @Test
    public void testUpdate(){
        News news = (News ) session.get (News.class , 1);
        System.out.println (news );
    
        transaction.commit ();
        session.clear ();
    
        session = sessionFactory.openSession ();
        transaction = session.beginTransaction ();
    
         //此时对象为游离状态
        news.setAuthor ("Oracle" );
    
         //update 能够使游离对象变为持久化对象 .
         //通常须要发送一条 UPDATE 语句
         //若对象即为持久化对象 , 则不须要调用 update() 方法
        session.update (news );
    }

注意:
1) . 使用场景: B\S 项目中从页面传过来一个对象,须要对其进行更新时,即调用 update()方法
2) . 若数据表中没有对象相应的记录,还要运行 update() 方法,则会抛出异常: org.hibernate.StaleObjectStateException

9. saveOrUpdate (): 保存或更新

11. delete ():删除一个对象相应的记录。
    1). 若仅仅想删除指定的对象,设置 ID 就可以。

    2). 若数据表中没有相应的记录。则抛出异常: java.lang.IllegalArgumentException

12. Hibernate 调用原生的 JDBC
API:

    session.doWork(new
Work() {
        @Override
        public void execute(Connection
connection ) throws SQLException {
             //使用 JDBC 原生的 API
         }
    });




Hibernate持久化对象的状态的更多相关文章

  1. Hibernate 持久化对象的状态

    持久化对象有3种状态:1.持久化状态      2.临时状态      3.游离状态 Session 的特定方法能使对象从一个状态转换到另一个状态临时对象(transient)•    在使用代理主键 ...

  2. 1.1Hibernate持久化类和Hibernate持久化对象状态

    一.持久化对象po类 1.po定义 PO,是Persistent Object的缩写,是持久化类.PO是由PO=POJO+hbm映射配置组成. 2.通俗理解 PO类即持久化类,其实就是一个普通的Jav ...

  3. Hibernate之Session对象的相关方法以及持久化对象的状态

    一.持久化对象的状态        站在持久化的角度, Hibernate 把对象分为 4种状态: 持久化状态,临时状态,游离状态,删除状态.Session 的特定方法能使对象从一个状态转换到另一个状 ...

  4. Java对象在Hibernate持久化层的状态

    -临时状态:刚用new语句创建对象,还没有被持久化,并且不处于Session缓存中.处于临时状态的java对象被称为临时对象. -持久化状态:已经被持久化,并且加入到Session的缓存中.处于持久化 ...

  5. hibernate中持久化对象的状态

    持久化对象有以下几种状态: 临时对象(Transient): 在使用代理主键的情况下,  OID 通常为 null  不处于 Session 的缓存中 在数据库中没有对应的记录 持久化对象(也叫”托管 ...

  6. Hibernate框架--对象的状态,缓存, 映射

    回顾Hibernate第二天: 1.  一对多与多对一 2. 多对多 3. inverse/cascade 4. 关联关系的维护 一对多: <set name="映射的集合属性&quo ...

  7. Hibernate持久化对象修改id重新保存的办法

    Hibernate持久化对象修改id重新保存的办法——Hibernate学习记录二 2017年11月10日 20:16:48 筱光 阅读数:1122   版权声明:本文为博主原创文章,未经博主允许不得 ...

  8. Hibernater中的持久化对象以及状态转换

    一.持久化对象的要求 1.提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance() 来实例化持久化类. 2.提供一个标识属性(identifier prop ...

  9. hibernate 持久化对象 save

    hibernate 持久化对象 save new出来的user对象是游离状态的对象,执行session.save()方法保存后,user对象就变为持久化了,持久化的对象跟数据库表双向绑定的意思, 对象 ...

随机推荐

  1. 多个Fragment在屏幕翻转会重影问题的解决

    fragment使用add和hide而不用replace的方法添加到activity中,如果屏幕翻转可能会又add新的fragment进去,所以会重影. 如果有一个sparsearray保存fragm ...

  2. FreeRTOS API

    Task Creation xTaskCreate vTaskDelete Task Control vTaskDelay vTaskDelayUntil uxTaskPriorityGet vTas ...

  3. 利用Lucene与Nutch构建简单的全文搜索引擎

    文章地址 1.简介 本次实现分为两个部分,第一个部分是利用Lucene构建一个全文的搜索引擎,另外一部分则是利用Nutch实现同样的功能.由于Lucene并不是一个可以直接运行的程序,且不具备爬虫和文 ...

  4. ubuntu 包管理详解

    http://www.cnblogs.com/forward/archive/2012/01/10/2318483.html

  5. Source Insight常用快捷键及注释快捷键设置

    转:http://blog.csdn.net/tlaff/article/details/6536610 在使用SI过程中,我根据自己的使用习惯修改了它的默认快捷键,并且在配置文件中添加了一些人性化功 ...

  6. 一步一步实现listview加载的性能优化

    listview加载的核心是其adapter,本文针对listview加载的性能优化就是对adpter的优化,总共分四个层次: 0.最原始的加载 1.利用convertView 2.利用ViewHol ...

  7. arcgis Listview

    private ListView listView;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCrea ...

  8. NAT详解 z

    http://www.cnblogs.com/beginmind/p/6380489.html 1.为什么出现了NAT? IP地址只有32位,最多只有42.9亿个地址,还要去掉保留地址.组播地址,能用 ...

  9. Nginx集群

    转自:http://hi.baidu.com/xingyuanju/blog/item/779a2a23b7ebb749935807f1.html http://hi.baidu.com/dianhu ...

  10. jquery省市选择案例

    1.代码实例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...