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. 【概率】【找规律】hdu6229 Wandering Robots

    题意:一个机器人在正方形迷宫的左上角,迷宫里有些格子有障碍物,每一步机器人会等概率地向能走的格子转移(包含自身).问你无限长的时间之后,机器人处于矩形对角线的右下方的概率. 无限长时间意味着,起点没有 ...

  2. MYSQL学习笔记 (一)

    每次面试后,都决定一改前非.事实上依然和那些发誓再吃最后一份美食的胖子一样.不管这次是不是三分钟热度但是至少我开始.   MYSQL引擎      说到MYSQL引擎我又想起研二时候去面试的第一家公司 ...

  3. NSDictionary , NSMutableDictionary, NSMutableDictionary 和 NSMutableSet)相当于java的map、set

    1 NSDictionary 和 NSMutableDictionary NSDictionary  :就是java中的map; 放入对象是键值对 key-value  , 同样 秉持了一样的原则,只 ...

  4. GNU 是什么?

    https://www.gnu.org/ GNU 是什么? GNU is a Unix-like operating system that is free software—it respects ...

  5. Android的Master/Detail风格界面中实现自定义ListView的单选

    原文在这里:http://duduli.iteye.com/blog/1453576 可以实现多选,那么如何实现单选呢,这里我写了一个非常简单的方法: public void onListItemCl ...

  6. 我的sourceinsight的配置

    下面是我的sourceinsight的配置,点击下面的链接,下载*.em文件,将他们添加到Base工程,设置相应的快捷键即可,或者导入下载的配置文件. http://pan.baidu.com/s/1 ...

  7. 【JSP EL】EL表达式里日期按照格式显示

    转:http://blog.csdn.net/kaishuaige/article/details/8505174 JSP页面用EL表达式 输出date格式     1.头上引入标签 <%@ t ...

  8. pytest文档12-skip跳过用例

    前言 pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能 skip意味着只有在满足某些条件时才希望测试通过,否则pytest应该跳过运行测试. 常见示例是 ...

  9. UIView独占响应事件

    exclusiveTouch A Boolean value that indicates whether the receiver handles touch events exclusively. ...

  10. 【GISER&&Painter】Chapter01:WebGL渲染初体验

    基于上一篇OpenGL的渲染原理,这两周又陆续接触了一些关于WebGL绘图的一些内容,因为刚入门,很多东西又很晦涩,所以特意花了小半天的时间整理了一下,特此记录. 零  画一个多边形吧! 把一个多边形 ...