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
![](http://img.blog.csdn.net/20160416134947048)
使用save和delete方法验证,执行testDelete,结果为:
![](http://img.blog.csdn.net/20160416135031642)
使用delete方法验证,执行testDelete2,结果为:
![](http://img.blog.csdn.net/20160416135144721)
使用load方法验证,执行testLoad,结果为:
![](http://img.blog.csdn.net/20160416135354097)
使用get方法验证,执行testGet,结果为:
![](http://img.blog.csdn.net/20160416135450492)
5.hibernate对象三种状态的图形表示
![](http://img.blog.csdn.net/20160416135606254)
以上即为hibernate对象三种状态的相关内容,这是hibernate提供的Session接口各种用法的内在原理,需要好好理解。
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接口各种用法的内在原理,需要好好理解。
相关文章推荐
- 最短路径算法
- activiti自定义流程之整合(六):获取我的申请任务
- [学习笔记]Java如何处理EXCEL的读取
- [学习笔记]jsp web.xml文件的作用及基本配置
- [学习笔记]在struts2.0框架中,多struts.xml与多applicationContext.xml配置的方法
- APM四轴组装调试记录
- android studio从1.5更新到2.0后terminal无法运行gradle命令,提示无法找到gradle命令
- 2016SDAU编程练习二1001
- [学习笔记]struts.xml配置详解(所有基本配置,包括通配符)
- [学习笔记] JAVA菜鸟入门篇-JDK安装以及配置
- [学习笔记]多维数组
- 和同事相处的30个原则(转载)
- 消息中间件(一)JMS与ActiveMQ
- 【转】Git如何Check Out出指定文件或者文件夹
- Lock file left by a different patch, OPatch will not try re-using the lock file.
- AndroidStudio上github使用
- Spring初探----Bean的生命周期
- PHP表单处理
- ASP.NET MVC 基础(01)
- [学习笔记]打印出该月的日期表格,日历形式