hibernate 对象的持久化状态。 在session.save()之后 commit()之前 数据库有对应的记录吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate 对象的持久化状态。 在session.save()之后 commit()之前 数据库有对应的记录吗?相关的知识,希望对你有一定的参考价值。

如果没有对应的记录,持久化对象这个取名从何得来?

hibernate对象持久态是说和Session发生了关系,save、get、query。有3方面特点

1)Session中会缓存该对象(Session的缓存叫一级缓存)
2)Session再获取对象时,首先去查找一级缓存,如果没有才查询数据库
3)Session要负责将持久态对象的变化更新到数据库
(是在flush()的时候更新,在提交的时候会自动调用session的flush())追问

只要session没有关闭 就是持久化状态对吗?
即使commit()之后,如果session没关闭 也是持久化状态对吗?

追答

Yes 只有和session 解除关系了 才不是持久化
session.evict(Object obj):游离态

参考技术A hibernate 自己有一套缓存机制,没commit()之前,都放在缓存里的追问

你的意思是commit()之前 数据库中没对应记录是吗?

追答

我确定是这样的

追问

很多资料上写的“持久化对象和数据库中的相关记录对应”这句话是什么意思?

追答

持久化对象 和 数据库里的记录 绑定了 ,你持久化的对象 一定是放在数据库里没有问题的,而且保证结构一致

追问

这样说你看对不对?
对象处于持久化状态的时候,数据库里可以有 也可以没有记录。

追答

对象处于持久化状态的时候,数据库里一定是没有的,这方面资料你可以参照下 oralce数据库 的 操作

追问

谢了
有可能是有数据的。 get() load()的时候 对象也是持久化状态。

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

一、概述

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

-持久化状态:已经被持久化,并且加入到Session的缓存中。处于持久化状态的java对象被成为持久化对象。

-游离状态:已经被持久化,但不再处于Session的缓存中。处于游离状态的java对象被成为游离对象。

 

临时对象的特征:
        -OID为null
        -不处于Session的缓存中,也可以说,不被任何一个Session实例关联
        -在数据库中没有对应的记录

持久化对象的特征:
        -OID不为null
        -位于一个Session实例的缓存中,持久化对象总是被一个Session实例关联
        -持久化对象和数据库中的相关记录对应
        -会根据持久化对象的属性变化,同步更新数据库。
            User  user=(User)session.get(User.class,1);//获取持久化对象 持久状态
            user.setName("jerry");
            transaction.commit();
        我们发现我们没有执行update语句,却打印了update语句。Hibernate会自动将持久化对象的状态同步到数据库中。


游离对象的特征:
        -OID不为null
        -不再位于Session的缓存中,也可以说,游离对象不被Session关联
        -数据库中有对应的记录 

 

例子:

        //对象状态转换的过程
        Transaction ts=session.beginTransaction();
        User user =new User();                  //临时状态
         user.setName("tom");
         user.setPassword("123456");

        session.save(user);                     //转变为持久化状态
        ts.commit();                            //持久化状态 

        session.close();                        //转变为游离状态
        sessionfactory.close();
        System.out.println(user.getName());     //游离状态 

 

二、三种状态的转换

 

    1)临时状态转换持久化状态
        -Session的save()方法会将临时状态转换成持久状态。
            把要保存的对象放入Session缓存中,使它进入持久化状态。使用映射文件指定的主键生成策略,为持久化对象分配唯一OID。
            save方法只是为对象分配UID。我们可以在save方法处打断点。
            当我们的主键生成策略为native时,由于我们使用mysql数据库,主键自增,所以执行完save方法后,打印insert语句,mysql数据库为我们对象自增OID 

            当我们的主键生成策略为incrementt时,increment是由Hibernate维护,先去表中查最大ID然后+1,我们执行完save方法之后,发现打印select查找最大id的语句,执行commit时才打印插入语句


    2)临时状态转换成游离状态
        -将临时状态的对象OID设置为数据库中对应的记录.
        User user=new User();
        user.setId(1);

    3)持久化状态转换成临时状态
        第一种:
            User  user=(User)session.get(User.class,1);//获取持久化对象 持久状态
            session.close(); //游离状态
            user.setId(null);//临时状态 
        第二种:
            User  user=(User)session.get(User.class,1);//获取持久化对象 持久状态
            session.evict(user); //游离状态,此方法会将session缓存中清除持久化对象,使其变为游离状态
            user.setId(null);//临时状态  

    4)持久化状态转换成游离状态
        第一:调用session的close方法,持久化状态变为游离状态
        第二: 调用session的evict()方法方法,将持久状态转变为游离状态


    5)游离状态转换成临时状态
        只需要将游离状态的对象OID变为null。

    6)游离状态转换成持久状态
        Session的update()方法使游离状态转换成持久状态。
            User  user=(User)session.get(User.class,1);//获取持久化对象 持久状态
            session.evict(user); //游离状态,此方法会将session缓存中清除持久化对象,使其变为游离状态
            session.update(user);

 

  

 

  

 

 

以上是关于hibernate 对象的持久化状态。 在session.save()之后 commit()之前 数据库有对应的记录吗?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate缓存知识要点

Hibernate持久化对象的状态

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

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

Hibernate Session对象核心方法

hibernate框架学习之对象状态