02-Hibernate实体类的三种状态

一.Hibernate的实体类有三种状态

Transient:瞬时状态,不被hibernate session管理,而且实体数据在数据库不存在

Persistent:持久化状态,被session管理,此时的对象被放在session的缓存中,实体对象存在数据库中。

Detached:离线状态,实体对象在数据库中有数据与之对应,但是不被session管理

注意:被session所管理的实体对象,当对象的属性发生改变,在提交事务的时候会自动更新改变后的属性到数据库中。

下图是hibernate试题对象三种状态的转化

二.三种状态转换代码演示


/**

* 调用Save()方法。对象由transient状态转变为persistent状态

*/

@Test

public void testTransicentSave() {

Session session=null;

try {

session=HibernateUtil.openSession();

session.beginTransaction();

User u=new User();

u.setNickName("steven");

u.setPassword("000");

u.setUserName("xinchen");

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");

u.setBorn(sdf.parse("1987-01-01"));

//在调用save方法之前,此时的u是transient状态

//调用save方法后,u是persistent状态,对象受session的管理

session.save(u);

//更改u对象,因为u是persistent状体,所以commit的时候会发出两条sql语句 insert和update

u.setUserName("xchen8");

session.getTransaction().commit();

} catch (Exception e) {

e.printStackTrace();

if(session!=null) session.getTransaction().rollback();

} finally{

HibernateUtil.closeSession(session);

}

}

/**

* 调用SaveOrUpdate()方法。对象由transient状态转变为persistent状态

*/

@Test

public void testTransicentSaveOrUpdate() {

Session session=null;

try {

session=HibernateUtil.openSession();

session.beginTransaction();

User u=new User();

u.setNickName("超人");

u.setPassword("000");

u.setUserName("superman");

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");

u.setBorn(sdf.parse("1988-01-01"));

//在调用save方法之前,此时的u是transient状态

//调用save方法后,u是persistent状态,对象受session的管理

session.saveOrUpdate(u);

//更改u对象,因为u是persistent状体,所以commit的时候会发出两条sql语句 insert和update

u.setUserName("xin.chen");

session.getTransaction().commit();

} catch (Exception e) {

e.printStackTrace();

if(session!=null) session.getTransaction().rollback();

} finally{

HibernateUtil.closeSession(session);

}

}

/**

* 测试persistent状态下update多次没有意义

*/

@Test

public void testPersistent01() {

Session session=null;

try {

session=HibernateUtil.openSession();

session.beginTransaction();

User u=new User();

u.setNickName("钢铁侠");

u.setPassword("000");

u.setUserName("iron-man");

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");

u.setBorn(sdf.parse("1908-01-01"));

//在调用save方法之前,此时的u是transient状态

//调用save方法后,u是persistent状态,对象受session的管理

session.save(u);

u.setUserName("Iron Man");

//对象已经是persistent状体,调用update没有意义

session.update(u);

u.setPassword("333");

session.update(u);

//只会发出两条sql,insert和update

session.getTransaction().commit();

} catch (Exception e) {

e.printStackTrace();

if(session!=null) session.getTransaction().rollback();

} finally{

HibernateUtil.closeSession(session);

}

}

/**

* 测试persistent状态下update多次没有意义

*/

@Test

public void testPersistent02() {

Session session=null;

try {

session=HibernateUtil.openSession();

session.beginTransaction();

User u=new User();

u.setNickName("绿巨人");

u.setPassword("000");

u.setUserName("Green Man");

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");

u.setBorn(sdf.parse("1908-01-01"));

//在调用save方法之前,此时的u是transient状态

//调用save方法后,u是persistent状态,对象受session的管理

session.save(u);

//对象已经是persistent状体,调用update没有意义

session.update(u);

session.update(u);

//只会发出一条sql,insert

session.getTransaction().commit();

} catch (Exception e) {

e.printStackTrace();

if(session!=null) session.getTransaction().rollback();

} finally{

HibernateUtil.closeSession(session);

}

}

/**

* 测试persistent状态,通过load方法变成persistent状态

*/

@Test

public void testPersistent03() {

Session session=null;

try {

session=HibernateUtil.openSession();

session.beginTransaction();

//调用load方法后,u是persistent状态,对象受session的管理

User u=(User)session.load(User.class, 1L);

u.setUserName("CX");

//会发出两条条sql,select,update

session.getTransaction().commit();

} catch (Exception e) {

e.printStackTrace();

if(session!=null) session.getTransaction().rollback();

} finally{

HibernateUtil.closeSession(session);

}

}

/**

* 测试persistent状态,通过load方法变成persistent状态

*/

@Test

public void testPersistent04() {

Session session=null;

try {

session=HibernateUtil.openSession();

session.beginTransaction();

//调用load方法后,u是persistent状态,对象受session的管理

User u=(User)session.load(User.class, 1L);

session.getTransaction().commit();

//u此时为离线状态,只会发一条select sql

u.setUserName("CXddd");

//会发出两条条sql,select,update

} catch (Exception e) {

e.printStackTrace();

if(session!=null) session.getTransaction().rollback();

} finally{

HibernateUtil.closeSession(session);

}

}

/**

* 测试persistent状态,通过load方法变成persistent状态

*/

@Test

public void testPersistent05() {

Session session=null;

try {

session=HibernateUtil.openSession();

session.beginTransaction();

//调用load方法后,u是persistent状态,对象受session的管理

User u=(User)session.load(User.class, 1L);

session.getTransaction().commit();

//u此时为离线状态,只会发一条select sql

session.beginTransaction();

//u为persistent状态

u.setUserName("CX11");

//会发出两条条sql,select,update

session.getTransaction().commit();

} catch (Exception e) {

e.printStackTrace();

if(session!=null) session.getTransaction().rollback();

} finally{

HibernateUtil.closeSession(session);

}

}

/**

* 测试persistent状态,通过load方法变成persistent状态

* 调用clear方法,变为detached状态

*/

@Test

public void testPersistent06() {

Session session=null;

try {

session=HibernateUtil.openSession();

session.beginTransaction();

//调用load方法后,u是persistent状态,对象受session的管理

User u=(User)session.load(User.class, 1L);

//u为persistent状态

u.setUserName("CX11ddd");

//调用clear方法后,u为离线状态,所以只发一条select sql

session.clear();

session.getTransaction().commit();

} catch (Exception e) {

e.printStackTrace();

if(session!=null) session.getTransaction().rollback();

} finally{

HibernateUtil.closeSession(session);

}

}

/**

* 测试detached状态,

*/

@Test

public void testDetached01() {

Session session=null;

try {

session=HibernateUtil.openSession();

session.beginTransaction();

//u是detached状态,因为数据库中有id=1的数据

User u=new User();

u.setId(1L);

u.setUserName("测试detached");

//调用save后,会根据id生成规则生成一条persistent的对象

session.save(u);

session.getTransaction().commit();

} catch (Exception e) {

e.printStackTrace();

if(session!=null) session.getTransaction().rollback();

} finally{

HibernateUtil.closeSession(session);

}

}

/**

* 测试detached状态,

*/

@Test

public void testDetached02() {

Session session=null;

try {

session=HibernateUtil.openSession();

session.beginTransaction();

//u是detached状态,因为数据库中有id=1的数据

User u=new User();

u.setId(4L);

u.setUserName("测试detached");

//调用update后,u变成persistent的对象

session.update(u);

System.out.println(u.getPassword());

u.setUserName("hhhh哦哦哦");

session.update(u);

//只发出一条update

session.getTransaction().commit();

} catch (Exception e) {

e.printStackTrace();

if(session!=null) session.getTransaction().rollback();

} finally{

HibernateUtil.closeSession(session);

}

}

/**

* 测试detached状态,

*/

@Test

public void testDetached03() {

Session session=null;

try {

session=HibernateUtil.openSession();

session.beginTransaction();

//u是detached状态,因为数据库中有id=1的数据

User u=new User();

u.setId(1L);

u.setUserName("测试detached");

//调用delete后,u变成transient的对象

session.delete(u);

u.setUserName("hhhh哦哦哦11");

//只发出一条delete

session.getTransaction().commit();

} catch (Exception e) {

e.printStackTrace();

if(session!=null) session.getTransaction().rollback();

} finally{

HibernateUtil.closeSession(session);

}

}

/**

* 测试detached状态,

*/

@Test

public void testDetached04() {

Session session=null;

try {

session=HibernateUtil.openSession();

session.beginTransaction();

//u是detached状态,因为数据库中有id=1的数据

User u1=(User)session.load(User.class, 2L);

System.out.println(u1.getUserName());

User u2=new User();

u2.setId(2L);

u2.setUserName("d333");

//此时u2将会变成持久化状态,在session的缓存中就存在了两份同样的对象,在session中不能存在两份拷贝,否则会抛出异常

//            session.saveOrUpdate(u2);

//merge方法会判断session中是否已经存在同一个对象,如果存在就将两个对象合并

session.merge(u2);

session.getTransaction().commit();

} catch (Exception e) {

e.printStackTrace();

if(session!=null) session.getTransaction().rollback();

} finally{

HibernateUtil.closeSession(session);

}

}

三.源代码in Github

查看源代码

时间: 2024-08-05 12:02:14

02-Hibernate实体类的三种状态的相关文章

hibernate实体对象的三种状态:自由状态,持久状态,游离状态.

自由态与游离态的区别: 当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它 对应的记录,只是现在这个游离对象脱离了Hibernate的缓存管理,而自由对象不会在数据库中出现与它对应的数据记录 (1)自由状态(Transient) 特性: ①不在Session的缓存中,不与任何的Session实例相关联. ②在数据库中没有与之相对应的记录. (2)持久状态(Persistent) 特性 ①在Session

【SSH三大框架】Hibernate基础第三篇:实体对象的三种状态以及get、load、persist三个方法的详解

一.Hibernate中实体对象分为三种状态:瞬态.持久.脱管 瞬态(transient):这种状态下的实体对象,数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来的并且与Session没有任何关系的对象. 持久(persistent):数据库中有数据与之对应,当前与Session有关联,并且相关联的Session并没有关闭,事务没有提交.PS:持久对象发生改变的时候,在事务提交的时候会影响到数据库中. 脱管(detached):数据库中有数据与之对应,但当前没有Se

Hibernate系列(三):实体对象的三种状态以及get、load、persist三个方法的详解

一.Hibernate中实体对象分为三种状态:瞬态.持久.脱管 瞬态(transient):这种状态下的实体对象,数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来的并且与Session没有任何关系的对象. 持久(persistent):数据库中有数据与之对应,当前与Session有关联,并且相关联的Session并没有关闭,事务没有提交.PS:持久对象发生改变的时候,在事务提交的时候会影响到数据库中. 脱管(detached):数据库中有数据与之对应,但当前没有Se

Hibernate持久化对象的三种状态

在Hibernate中,持久化对象在被操作的过程中可以分为三个时期,这三个时期是和Session的周期相关的,因为Hibernate中的操作都是基于Session完成的.Session的特定方法能使对象从一个状态转换到另一个状态. 持久化对象的生命周期有三种,瞬时状态.持久状态和分离状态.如下图: 瞬时态 不曾进行持久化,未与任何Session相关联.此状态的对象是用new关键字创建出来的,此时对象没有和数据库中记录对应. //Transient状态 Useruser = new User();

【hibernate进阶】hibernate持久化对象的三种状态

Hibernate持久化对象的三种状态:瞬时对象(Transient Objects),持久化对象(Persist Objects),离线对象(Detached Objects). 三种状态:    瞬时对象(Transient Objects):使用new 操作符初始化的对象不是立刻就持久的.它们的状态是瞬时的,也就是说他们没有任何跟数据库表相关联的行为,只要应用不在引用这些对象(不再被任何其他对象所引用),它们的状态将会丢失,并由垃圾回收机制回收. 持久化对象(Persist Objects

JavaWeb_(Hibernate框架)Hibernate中对象的三种状态

对象的三种状态 瞬时状态: 实体 没有id.没有与session关联 持久化状态: 特点:持久化状态对象的任何改变都会同步到数据库中 游离态[也称作托管态]: 实体 有id,没有与session关联 Hibernate向数据库中增加用户调用addUser()方法时 //增加用户 public void addUser() { //得到配置信息 Configuration config = new Configuration().configure(); //创建sessionFactiory对象

Hibernate之对象的三种状态

Hibernate之Java对象的三种状态 一.简述 本博文大部分的思想和内容引子CSND上名为 FG2006 这位大神的文章,连接地址为:http://blog.csdn.net/fg2006/article/details/6436517.在此表示歉意和深深的谢意.如若各位读者在阅读的过程中发现有任何的纰漏或者错误,请及时之处,本人不胜感激, Hibernate中对象有三种状态: 临时状态(Transient).持久状态(Persistent).游离状态(Detached). 临时状态:刚刚

Hibernate中对象的三种状态,以及三种状态间的转化方法

在Hibernate中有三种状态,对它的深入理解,才能更好的理解hibernate的运行机理,刚开始不太注意这些概念,后来被别人问到了,说是面试题,才发现它是重要的.对于需要持久化的JAVA对象,在它的生命周期中有三种状态,而且互相转化. Hibernate三种状态之一:临时状态(Transient):也叫瞬时状态,在一个对象刚被创建的时候,比如People people = new People(),它没有持久化,并没有处于Session的缓存中,这种状态的对象叫就是临时对象: Hiberna

Hibernate对象持久化的三种状态

1.三种状态: public static void testSel() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); Student student=new Student();//瞬时态 student.setSname("zzzz");//瞬时态 student.setSex("男");//瞬时态 s