精华内容
下载资源
问答
  • 对Java Web开发处于初学阶段,之前从书上看到Hibernate对象的瞬态、持久化态、脱管态,都仅限于字面阅读,...对象是通过get方法获取的,于是进入持久化状态。处于持久化状态的对象,对其的修改,Hibernate会自动

    对Java Web开发处于初学阶段,之前从书上看到Hibernate对象的瞬态、持久化态、脱管态,都仅限于字面阅读,浅尝辄止。

    进来在开发调试中,偶然发现将update语句注释掉之后,Hibernate仍然会发送update的SQL语句,百思不得其解,后逐步查资料发现是持久化状态的原因。

    对象是通过get方法获取的,于是进入持久化状态。处于持久化状态的对象,对其的修改,Hibernate会自动检测到,并且在当前操作结束后(session结束之前)将对象数据写回数据库。无需显示调用update接口。

    展开全文
  • 了解Hibernate持久化对象的状态可以很好帮助我们理解hibernate_Session核心方法,但是如果想要明白持久化对象在Hibernate中怎么分类,我们首先需要搞清楚什么OID! 在关系数据库中,主键用来识别记录,并...

    了解Hibernate持久化对象的状态可以很好的帮助我们理解hibernate_Session的核心方法,但是如果想要明白持久化对象在Hibernate中是怎么分类的,我们首先需要搞清楚什么是OID!

    在关系数据库中,主键用来识别记录,并保证每天记录的唯一性。在Java语言中,通过比较两个变量所引用对象的内存地址是否相同,或者比较两变量引用的对象是否相等。Hibernate为了解决两者之间的不同,使用对象标识符(OID)来标识对象的唯一性。OID是关系数据库中主键在Java对象模型中的等价物。在运行时,Hibernate根据OID来维持Java对象和数据库中的对应关系。如下所示:

    Transaction tx = session.beginTransaction();
    User user1 = (User)session.load(User.class,new Long(1));
    User user2 = (User)session.load(User.class,new Long(1));
    User user3 = (User)session.load(User.class,new Long(3));

     

    应用程序在执行上述代码时,第一次OID为1的对象,从数据库中查找ID为1的记录,然后创建想要的User实例,并把它保存到session的缓存中,最后将该实例的引用赋值给变量user1,第二次加载OID为1的对象时,直接把session缓存中的OID为1的实例的引用赋值给user2,因此user1=user2的结果为true。

     

    我们大致可以把Hibernate中的持久化对象的状态分为四种:临时状态,持久化状态,删除状态,游离状态

    1、临时状态(Transient)

    在使用代理主键的情况下, OID 通常为 null
    不处于 Session 的缓存中
    在数据库中没有对应的记录 

    2、持久化状态(也叫”托管”)(Persist)

    OID 不为 null
    位于 Session 缓存中
    若在数据库中已经有和其对应的记录, 持久化对象和数据库中的相关记录对应
    Session 在 flush 缓存时, 会根据持久化对象的属性变化, 来同步更新数据库
    在同一个 Session 实例的缓存中, 数据库表中的每条记录只对应唯一的持久化对象

    3、删除状态(Removed)

    在数据库中没有和其 OID 对应的记录
    不再处于 Session 缓存中
    一般情况下, 应用程序不该再使用被删除的对象

    4、游离状态(也叫”脱管”) (Detached)

    OID 不为 null
    不再处于 Session 缓存中
    一般情况下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录

    展开全文
  • 1. 持久化类:就是一个Java类(咱们编写JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类。 * 持久化类 = JavaBean + xxx.hbm.xml 持久化编写规则 1. 提供一个无参数 public访问控制符...

    什么是持久化类

    1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类。
    * 持久化类 = JavaBean + xxx.hbm.xml

    持久化类的编写规则

    1. 提供一个无参数 public访问控制符的构造器 -- 底层需要进行反射.
    2. 提供一个标识属性,映射数据表主键字段 -- 唯一标识OID.数据库中通过主键.Java对象通过地址确定对象.持久化类通过唯一标识    OID确定记录
    3. 所有属性提供public访问控制符的 set或者get 方法
    4. 标识属性应尽量使用基本数据类型的包装类型

    Hibernate 持久化对象的状态

    1. Hibernate的持久化类
    * 持久化类:Java类与数据库的某个表建立了映射关系.这个类就称为是持久化类.
    * 持久化类 = Java类 + hbm的配置文件
    2. Hibernate的持久化类的状态
    * Hibernate为了管理持久化类:将持久化类分成了三个状态
    * 瞬时态:Transient Object
    * 没有持久化标识OID, 没有被纳入到Session对象的管理.
    * 持久态:Persistent Object
    * 有持久化标识OID,已经被纳入到Session对象的管理.
    * 脱管态:Detached Object
    * 有持久化标识OID,没有被纳入到Session对象的管理.

    Hibernate 持久化对象的状态的转换

    1. 瞬时态 -- 没有持久化标识OID, 没有被纳入到Session对象的管理
    * 获得瞬时态的对象
    * User user = new User()
    * 瞬时态对象转换持久态
    * save()/saveOrUpdate();
    * 瞬时态对象转换成脱管态
    * user.setId(1)
    2. 持久态 -- 有持久化标识OID,已经被纳入到Session对象的管理
    * 获得持久态的对象
    * get()/load();
    * 持久态转换成瞬时态对象
    * delete(); --- 比较有争议的,进入特殊的状态(删除态:Hibernate中不建议使用的)
    * 持久态对象转成脱管态对象
    * session的close()/evict()/clear();
    3. 脱管态 -- 有持久化标识OID,没有被纳入到Session对象的管理
    * 获得托管态对象:不建议直接获得脱管态的对象.
    * User user = new User();
    * user.setId(1);
    * 脱管态对象转换成持久态对象
    * update();/saveOrUpdate()/lock();
    * 脱管态对象转换成瞬时态对象
    * user.setId(null);
    4. 注意:持久态对象有自动更新数据库的能力!!!



    代码示例:

    package com.kunaly.test;
    
    import java.io.Serializable;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.kunaly.domain.User;
    import com.kunaly.utils.HibernateUtils;
    
    /**
     * 持久化对象的三种状态
     * @author Administrator
     *
     */
    public class Demo03 {
    	
    	@Test
    	public void run1() {
            // 获取session
    		Session session = HibernateUtils.getSession();
    		Transaction tr = session.beginTransaction();
    		
    		// 持久User的对象
    		// 瞬时态: 没有OID的值,也没有被session管理,此时的user对象是瞬时态对象
    		User user = new User();
    		user.setName("张飞");
    		user.setAge(38);
    		
    		// 使用session保存用户
    		// user对象中已经存在id的值,没默认情况下,把user对象也保存到session的缓存中
    		Serializable id = session.save(user);
    		System.out.println("主键的值是"+id);
    		// user 是持久态对象
    		
    		tr.commit();
    		// session销毁,缓存没有了
    		session.close();
    		// 打印
    		// user对象存在id值,但是session销毁了,缓存不存在。
    		//session还管理user对象?废话,session都死了,还管理个屁啊
    		//此时的user是托管态的对象
    		System.out.println(user.getId());
    		System.out.println(user.getName());
    		
    	}
    	
    	/**
    	 *  持久态的对象有自动更新数据库的能力
    	 */
    	@Test
    	public void run2() {
    		Session session = HibernateUtils.getSession();
    		Transaction tr = session.beginTransaction();
    		
    		// 获取持久态的对象
    		User user = session.get(User.class,1);
    		System.out.println(user.getName());
    		// user 是持久态,有自动更新数据库的能力
    		// 重新设置新的名称
    	    user.setName("刘玄德");
    		System.out.println(user.getName());
    		
    		tr.commit();
    		session.close();
    		
    	}
    	
    
    }
    



    展开全文
  • 使用对象new初始化的对象状态是瞬时,也就是说没有跟任何数据库关联行为,只要不应用这些对象,状态将会丢失,并有垃圾回收机制回收。 特征: 1、不处于Session缓存中,不跟任何一个Session实例关联。 2、...

      



    临时状态:

    使用对象new初始化的对象状态是瞬时的,也就是说没有跟任何数据库关联的行为,只要不应用这些对象,状态将会丢失,并有垃圾回收机制回收。

    特征:

    1、不处于Session的缓存中,不跟任何一个Session实例关联。

    2、在数据库没记录。

    以下情况下,Java对象进入临时状态

    通过new语句创建一个java对象,处于临时状态。

    Session的delete()方法能使持久化或者游离(脱管)的对象转换为临时状态的对象。



    持久化状态:

    持久化对象是任何具有数据库标识的实例。由Session统一管理,持久实例是在事务中进行操作的。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中.

    持久化对象总是与SessionTransaction关联在一起,在一个session中,对持久化对象的操作不会立即写到数据库,只有当Transaction(事务)结束时,才真正的对数据库更新,从而完成持久化对象和数据库的同步。在同步之前的持久化对象成为脏对象。



    游离(脱管)状态:

    Session 关闭后 ,持久化状态的对象就成了离线对象。离线表示这个对象不能再与数据库保持同步。

    与瞬时状态的区别是:离线对象是有持久化对象转过来的,数据库可能存在对应的记录。瞬时状态则无。

    Session一下方法会让持久化状态变为游离状态的对象:close()//清空缓存,如没继续引用,结束生命周期,evict()//从缓存中删除一个持久化对象;




    展开全文
  • hibernate持久化对象的四个状态

    千次阅读 2017-09-21 22:12:35
    持久化操作Hibernate核心。Hibernate实例状态分为4种: 1、瞬时状态(Transient) 2、持久化状态(Persistent) 3、游离状态(Detached) 4、删除状态瞬时状态(Transient) 通过new开辟内存空间创建...
  • 在Hibernate中持久化类的对象可以划分为三种状态,分别瞬态,持久态,脱管态。   1.  瞬态(Transient),也叫临时态。处于这种状态的对象具备的特征如下: a)  不在Session的缓存中,不与任何的Se
  • 【Hibernate】持久化对象的三种状态

    热门讨论 2017-02-02 10:03:24
    瞬时对象(Transient object):使用new操作符初始化的对象不是... 持久化对象(Persist object):持久化实例任何具有数据库标识实例,他有持久化管理器Session来统一管理,持久实例在事务过程中进行操作通过sq
  • 在Hibernate中持久化的对象可以划分为三种状态,分别: 瞬态,持久态,脱管态。 一、瞬时状态(Transient) 瞬时对象特点: (1) 不和 Session 实例关联 (2) 在数据库中没有和瞬时对象关联记录 通过Javanew...
  • Hibernate持久化对象的三种状态 ...在Hibernate中持久化类的对象可以划分为三种状态,分别瞬态,持久态,脱管态。   1. 瞬态(Transient),也叫临时态。处于这种状态的对象具备的特征如下: a) 不在Se
  • 在hibernate中持久化的对象可以划分为三种状态,分别瞬态,持久态,离线态。 【导图】  持久化对象的三种状态是可以相互转化,具体转换过程如图所示:   【分析】 瞬时状态:  使用new操作符初始化
  • 在session关闭之后再去修改user不会对数据库中数据造成任何影响。当session被关闭之后,user变成了一个detached对象。需要通过update()或者lock()方法来重新和一个新session关联。...重要的是通过update()方
  • hibernate中的持久化对象具有三种状态,分别是:瞬时状态、持久化状态、脱管状态。1.瞬时状态(Transient):实体对象是通过Java中的new关键字开辟内存空间创建的Java对象,但是它并没有纳入Hibernate Session 的...
  • 我们都知道,Java对象的生命周期,通过new语句创建开始,到不再被任何引用变量引用结束,结束后它占 用内存将被JVM垃圾回收机制收回。在Hibernate持久化对象可以划分为三种状态,瞬时对象(Transient  ...
  • 在Hibernate中持久化类的对象可以划分为三种状态,分别瞬态,持久态,脱管态。 1. 瞬态(Transient),也叫临时态。处于这种状态的对象具备的特征如下: a) 不在Session的缓存中,不与任何的Session实例相关联...
  • 使用Hibernate框架后,对数据库操作已经不是开发人员书写代码直接操作了,而是通过操作实体对象的状态,然后框架内部功能模块会根据实体对象的状态来执行响应操作。 Hibernate框架中,实体对象的状态...
  • Hibernate里有三种对象状态:临时状态 (Transient)、持久状态(Persistent)、游离状态(Detached) 持久状态对象也叫PO (PersistentObject... 临时状态对象是通过实例化的方式注入到内存中,也就是通过New方式来开辟内
  • 于是就有了今天这篇文章…其实我知道二级缓存存在,但是对于持久化对象的三种状态…没办法,我菜呗 凡技术必官网 官网 Hibernate缓存分类 Session缓存 介绍:Hibernate 内置一级缓存,默认开启 缓存...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 917
精华内容 366
关键字:

对象状态的持久化是通过