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. 工作中用到的git命令

    1.git stash 将本地的修改藏匿,不进行commit也可切换分支 2.git stash apply 将之前藏匿的修改恢复出来 3.git cherry-pick commitId git在当 ...

  2. Codeforces Round #346 (Div. 2) F. Polycarp and Hay 并查集 bfs

    F. Polycarp and Hay 题目连接: http://www.codeforces.com/contest/659/problem/F Description The farmer Pol ...

  3. uoj 48 核聚变反应强度 次小公因数

    [UR #3]核聚变反应强度 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/48 Description 著名核 ...

  4. mybatis源码分析(3)-----SqlSessionHolder作用

    1. sqlSessionHolder 是位于mybatis-spring 包下面,他的作用是对于sqlSession和事务的控制 sqlSessionHolder 继承了spring的Resourc ...

  5. JAVA容器-模拟LinkedList实现(双链表)

    概述 LinkedList实质上就是双向链表的拓展的实现,我们将关注一下问题.LinkedList 1.双向链表怎么来实现插入.删除.查询? 2.利用二分法提高查询效率. 3.不同步,线程不安全,需要 ...

  6. “请不要直接访问超全局$_GET数组”

    下载了一个名为NetBeans的IDE开发PHP程序,当我输入常用的的$name = $_GET['name'];时却收到警告:请不要直接访问超全局$_GET数组 请改用某些过滤函数(例如filter ...

  7. Spring JavaConfig @Import实例

    一般来说, 需要按模块或类别 分割Spring XML bean文件 成多个小文件, 使事情更容易维护和模块化. 例如, <beans xmlns="http://www.spring ...

  8. 如何删除Struts2动作的后缀扩展名

    在Struts2中,所有动作类有一个默认的后缀 .action 扩展. 例如, <struts> <package name="default" namespac ...

  9. jq幻灯片2013-8-31

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. windows下gVim(Vi/vim)基本使用

    Vim 是一个Linux 平台上功能非常强大的编辑器,他是早年的Vi 编辑器的加强版.这个gVim 是windows 版的,并且有了标准的windows 风格的图形界面,所以叫g(graphical) ...