hibernate对象的三种状态
来源:互联网 发布:php 时间查询 编辑:程序博客网 时间:2024/05/29 16:42
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;}//@Idpublic 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;@BeforeClasspublic static void beforeClass(){// 读取配置文件Configuration cfg = new AnnotationConfiguration();// 得到session工厂sf = cfg.configure().buildSessionFactory();}@Testpublic void testSave() {// 教师测试类Teacher t = new Teacher();t.setName("t1");t.setTitle("中级");System.out.println("transient状态下id============="+t.getId());// 得到sessionSession session = sf.openSession();// 开启事务session.beginTransaction();// session执行savesession.save(t);System.out.println("persistent状态下id============="+t.getId());// 事务提交session.getTransaction().commit();// 关闭sessionsession.close();System.out.println("ditached状态下id============="+t.getId());}@Testpublic void testDelete() {// 教师测试类Teacher t = new Teacher();t.setName("t1");t.setTitle("中级");System.out.println("transient状态下id============="+t.getId());// 得到sessionSession session = sf.getCurrentSession();// 开启事务session.beginTransaction();// session执行savesession.save(t);System.out.println("persistent状态下id============="+t.getId());// 事务提交session.getTransaction().commit();// 关闭sessionSystem.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();// 关闭sessionSystem.out.println("ditached状态下id============="+t.getId());}@Testpublic 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();// 关闭sessionSystem.out.println("ditached状态下id============="+t.getId());}@Testpublic void testLoad() {//使用代理,只有使用到查询对象时才会打印sqlSession 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());}@Testpublic void testGet() {//直接从数据库查询,会打印sqlSession 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());}@AfterClasspublic static void afterClass(){// 关闭session工厂sf.close();}}使用save方法验证,执行testSave,结果为:
使用save和delete方法验证,执行testDelete,结果为:
使用delete方法验证,执行testDelete2,结果为:
使用load方法验证,执行testLoad,结果为:
使用get方法验证,执行testGet,结果为:
5.hibernate对象三种状态的图形表示
以上即为hibernate对象三种状态的相关内容,这是hibernate提供的Session接口各种用法的内在原理,需要好好理解。
- Hibernate的对象的三种状态
- Hibernate的对象的三种状态
- Hibernate的三种对象状态
- hibernate对象的三种状态
- hibernate 实体对象的三种状态
- hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- hibernate的三种对象状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate数据对象的三种状态
- Hibernate对象的三种状态
- Hibernate的三种对象状态
- Hibernate对象的三种状态是什么
- [学习笔记]Java如何处理EXCEL的读取
- IOS开发笔记——禁用手势滑动返回功能
- [学习笔记]使用java读取Excel表格中的数据
- poj 2264 Advanced Fruits lcs
- [学习笔记]EXCEL导入功能java代码实现
- hibernate对象的三种状态
- [学习笔记]用Javascript实现Windows任务管理器
- 迅雷影音 win10安装不上的问题
- Android UI高级之Menu
- [学习笔记]Java排序算法:希尔排序(Shell排序)
- Android 插件化 动态升级
- [学习笔记]Java排序算法之归并排序
- JAVA 1.8 新特性学习(1) 接口的默认方法
- [学习笔记]排序算法之插入排序