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. hust 1590 - 方块游戏 数学

    1590 - 方块游戏 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/problem/show/1590 D ...

  2. Ext如何动态添加一行组件

    用的column布局,点击一个按钮能添加一行组件,如文本框,有下拉框等. 如: 效果: 实现方法如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  3. PWM DAC Low Pass Filtering

    [TI博客大赛][原创]LM3S811之基于PWM的DAC http://bbs.ednchina.com/BLOG_ARTICLE_3005301.HTM http://www.fpga4fun.c ...

  4. VC中__int64的用法

    VCVC6.0的64位整数分别叫做__int64与unsigned __int64,其范围分别是[-2^63, 2^63)与[0,2^64),即-922337203685 4775808~922337 ...

  5. vagrant多节点配置

    1.vagrantfile的配置 Vagrant.configure("2") do |config| config.vm.box = "xinjieLinux" ...

  6. B+树索引

    结构上 B树中关键字集合分布在整棵树中,叶节点中不包含任何关键字信息,而B+树关键字集合分布在叶子结点中,非叶节点只是叶子结点中关键字的索引: B树中任何一个关键字只出现在一个结点中,而B+树中的关键 ...

  7. uva 784 Maze Exploration(简单dfs)

    这道题看上去非常麻烦,什么迷宫啊.门之类的,事实上挺简单的,就是让把与 * 连通的都置为 # 包含 * , 直接dfs就能够了,只是我wa了好多次...最后居然是多读了一个换行.忘了加getchar( ...

  8. Go:如何组织代码

    备注 此文主要是对官方教程的学习总结,官方教程:http://golang.org/doc/code.html. 工作空间(Workspaces) Go代码必须保持在一个workspace,works ...

  9. [译林军] 译~CrossBridge 简介

    本文由 9ria 社区译林军翻译,转载请注明出处.加入译林军 :http://bbs.9ria.com/thread-286920-1-1.html CrossBridge 是  Adobe  Fla ...

  10. Eclipse中设置中文件javadoc

    Eclipse中设置中文件javadoc 在Eclipse中,我们常常看一些英文的JavaDoc提示或者没有相应的提示是很不习惯的,如下图所示: 我们现在要把这种不习惯的提示改为中文的JavaDOC提 ...