您的位置:首页 > 其它

hibernate对象的三种状态

2016-04-16 13:35 239 查看
hibernate对象具有三种状态,即transient、persistent和detached

1.当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于transient,其特点是:

(1) 不和 Session 实例关联

(2) 在数据库中没有和瞬时对象关联的记录

2.persistent总是与 Session 和 Transaction 相关联,在一个 Session 中,对持久对象的改变不会马上对数据库进行变更,而必须在 Transaction 终止,也就是执行 commit() 之后,才在数据库中真正运行 SQL 进行变更,持久对象的状态才会与数据库进行同步。

transient转为persistent:

(1) 通过 Session 的 save() 和 saveOrUpdate() 方法把一个瞬时对象与数据库相关联,这个transient就成为persistent。

(2) 使用 fine(),get(),load() 和 iterater() 待方法查询到的数据对象,将成为persistent。

persistent的特点:

(1) 和 Session 实例关联

(2) 在数据库中有和持久对象关联的记录

3.当session关闭后,对象就不处于Hibernate的缓存管理之中了,但是此时在数据库中还存在一条与该对象对应的数据记录,所以此时对象处于detached

与persistent关联的 Session 被关闭后,对象就变为detached。对detached的引用依然有效,对象可继续被修改。

detached特点:

(1) 本质上和transient相同

(2) 只是比transient多了一个数据库记录标识值 id.

persistent转为detached:

当执行 close() 或 clear(),evict() 之后,persistent会变为detached。

detached转为persistent:

通过 Session 的 update(),saveOrUpdate() 和 lock() 等方法,把detached变为persistent。

4.代码验证

仍然使用之前的Teacher

package com.baosight.model;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.SequenceGenerator;
import javax.persistence.TableGenerator;

/**
* <p>Title: </p>
* <p>Description:Teacher </p>
* <p>Company: </p>
* @author yuan
* @date 2016-4-10 下午12:32:46*/
@Entity
@TableGenerator(name="tableGEN",table="table_gen",pkColumnName="pk_key",valueColumnName="pk_value",pkColumnValue="teacher",allocationSize=1)
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB")
//@IdClass(value=TeacherPK.class)
public class Teacher {
private String id;
private String name;
private String title;
//private TeacherPK pk;
@Id
@GeneratedValue//auto
//	@GeneratedValue(strategy=GenerationType.TABLE,generator="tableGEN")
//	@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
//	@Id
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
//	@EmbeddedId
//	@Id
/*public TeacherPK getPk() {
return pk;
}
public void setPk(TeacherPK pk) {
this.pk = pk;
}*/

}
JUnit测试类TeacherTest.java

package com.baosight.model;

import static org.junit.Assert.*;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

/**
* <p>Title:TecherTest </p>
* <p>Description:TODO </p>
* <p>Company: </p>
* @author yuan
* @date 2016-4-13 下午10:32:17*/
public class TeacherTest {
private static SessionFactory sf = null;
@BeforeClass
public static void beforeClass(){
// 读取配置文件
Configuration cfg = new AnnotationConfiguration();
// 得到session工厂
sf = cfg.configure().buildSessionFactory();
}
@Test
public void testSave() {
// 教师测试类
Teacher t = new Teacher();
t.setName("t1");
t.setTitle("中级");

System.out.println("transient状态下id============="+t.getId());
// 得到session
Session session = sf.openSession();
// 开启事务
session.beginTransaction();
// session执行save
session.save(t);
System.out.println("persistent状态下id============="+t.getId());
// 事务提交
session.getTransaction().commit();
// 关闭session
session.close();
System.out.println("ditached状态下id============="+t.getId());
}
@Test
public void testDelete() {
// 教师测试类
Teacher t = new Teacher();
t.setName("t1");
t.setTitle("中级");

System.out.println("transient状态下id============="+t.getId());
// 得到session
Session session = sf.getCurrentSession();
// 开启事务
session.beginTransaction();
// session执行save
session.save(t);
System.out.println("persistent状态下id============="+t.getId());
// 事务提交
session.getTransaction().commit();
// 关闭session
System.out.println("ditached状态下id============="+t.getId());
//删除
Session session2 = sf.getCurrentSession();
// 开启事务
session2.beginTransaction();
// session执行
session2.delete(t);
System.out.println("persistent状态下id============="+t.getId());
// 事务提交
session2.getTransaction().commit();
// 关闭session
System.out.println("ditached状态下id============="+t.getId());
}
@Test
public void testDelete2() {
// 教师测试类
Teacher t = new Teacher();
t.setId("24");

System.out.println("transient状态下id============="+t.getId());
//删除
Session session2 = sf.getCurrentSession();
// 开启事务
session2.beginTransaction();
// session执行
session2.delete(t);
System.out.println("persistent状态下id============="+t.getId());
// 事务提交
session2.getTransaction().commit();
// 关闭session
System.out.println("ditached状态下id============="+t.getId());
}
@Test
public void testLoad() {
//使用代理,只有使用到查询对象时才会打印sql
Session session = sf.getCurrentSession();
// 开启事务
session.beginTransaction();
// session执行
Teacher t = (Teacher) session.load(Teacher.class, "1");
//打印代理对象名称
System.out.println(t.getClass().getName());
//		System.out.println(t);
//		System.out.println("id============="+t.getId());
// 事务提交
session.getTransaction().commit();
// 关闭session
//		System.out.println("id============="+t.getId());
}
@Test
public void testGet() {
//直接从数据库查询,会打印sql
Session session = sf.getCurrentSession();
// 开启事务
session.beginTransaction();
// session执行
Teacher t = (Teacher) session.get(Teacher.class, "1");
System.out.println(t.getClass().getName());
//		System.out.println(t);
//		System.out.println("id============="+t.getId());
// 事务提交
session.getTransaction().commit();
// 关闭session
//		System.out.println("id============="+t.getId());
}
@AfterClass
public static void afterClass(){
// 关闭session工厂
sf.close();
}
}
使用save方法验证,执行testSave,结果为:



使用save和delete方法验证,执行testDelete,结果为:



使用delete方法验证,执行testDelete2,结果为:



使用load方法验证,执行testLoad,结果为:



使用get方法验证,执行testGet,结果为:



5.hibernate对象三种状态的图形表示



以上即为hibernate对象三种状态的相关内容,这是hibernate提供的Session接口各种用法的内在原理,需要好好理解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: