`
lxc914_java
  • 浏览: 57455 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate 持久化对象状态详解

阅读更多

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

2.持久化对象(Persist Objects):持久实例是任何具有数据库标识的实例,它由持久化管理器Session统一管理,持久实例是在事务中进行操作的,它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的insert,update和delete语句把内存中的状态同步到数据库中。

3.离线/脱管对象(Detached Objects):Session关闭之后,持久化对象就变成了离线对象,离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。

 

下面用具体代码说,加深理解:

public void test1(){
	Configuration config=new Configuration().configure();  //读取hibernate配置文件
	SessionFactory factory=config.buildSessionFactory();  //创建session工厂
	Session session=factory.openSession();
	Student stu=new Student();  //瞬时对象
	try {
		session.beginTransaction();
		stu.setName("王五");
		stu.setPassword("123");
		stu.setAge(20);
		stu.setAddress("吉林");
		stu.setBirthday(new Date());
		session.save(stu);    //持久化对象
		session.getTransaction().commit();
		} catch (HibernateException e) {
		     // TODO Auto-generated catch block
		     e.printStackTrace();
		   session.getTransaction().rollback();
		}finally{	
		     session.close();    //离线对象
		}
	}

 

一. 瞬时对象:也就是上面的代码,如果我们没有对stu对象进行数据库插入工作(session.save(stu);),那么,当程序执行完毕,stu这个对象就不存在了,我们没有任何办法找到它(会被java 的垃圾回收机制,回收)。

 

二. 持久化对象:(1). 处于持久化的对象一定会有数据库标识

                        (2). 它必须与某个hibernate Session对象绑定。

以上两点缺一不可,否则它就不持久化对象。

上述代码中,当我们session.save(stu);之后,stu就变成了持久化对象,因为此时的它被session管理,同时也拥有了数据库标识。

持久化对象的特点:处于持久化状态的对象,如果它的状态发生了变化,hibernate将自动同步到数据库,看如下代码:

public void test2(){
	Configuration config=new Configuration().configure();  //读取hibernate配置文件
	SessionFactory factory=config.buildSessionFactory();  //创建session工厂
	Session session=factory.openSession();
	Student stu=new Student();  //瞬时对象
	try {
		session.beginTransaction();
		stu.setName("王五");
		stu.setPassword("123");
		stu.setAge(20);
		stu.setAddress("吉林");
		stu.setBirthday(new Date());
		session.save(stu);    //持久化对象
        stu.setName("王五一");  //当持久化对象的状态发生改变时,hibernate会将改变后的状态自动同步到数据库
		session.getTransaction().commit();
		} catch (HibernateException e) {
		     // TODO Auto-generated catch block
		     e.printStackTrace();
		   session.getTransaction().rollback();
		}finally{	
		     session.close();    //离线对象
		}
	}

 上面代码运行后的结果:

 

ID NAME PASSWORD AGE ADDRESS BIRTHDAY
237511  王五一     123 20 吉林 17-8月 -11 02.01.27.421000 下午

             

 三. 离线对象:持久化对象脱离了hibernate Session的管理,或者,一个对象只数据库标识。

 自动同步,当离线对象的状态发生变化时,hibernate不会自动同步到数据库,因为它脱离了hibernate Session,hibernate自然也不会检测到它的状态变化。

如下代码:

public void test3(){
	Configuration config=new Configuration().configure();  //读取hibernate配置文件
	SessionFactory factory=config.buildSessionFactory();  //创建session工厂
	Session session=factory.openSession();
	Student stu=new Student();  //瞬时对象
	try {
		session.beginTransaction();
		stu.setName("王五");
		stu.setPassword("123");
		stu.setAge(20);
		stu.setAddress("吉林");
		stu.setBirthday(new Date());
		session.save(stu);    //持久化对象
    		session.getTransaction().commit();
		} catch (HibernateException e) {
		     // TODO Auto-generated catch block
		     e.printStackTrace();
		   session.getTransaction().rollback();
		}finally{	
		     session.close();    //离线对象
             stu.setName("王五一"); //由于此时,stu处离线状态,当它的状态发生变化时,hibernate不会自动同步。
		}
	}

 上面代码运行后的结果:

 

ID NAME PASSWORD AGE ADDRESS BIRTHDAY
237511  王五    123 20 吉林 17-8月 -11 02.01.27.421000 下午

 

当对象处于离线状态时,我们怎样让它变成持久化状态呢,很简单,如下代码:

 

public void test4(){
		Configuration config=new Configuration().configure();
		SessionFactory factory=config.buildSessionFactory();
		Session session=null;
		Student stu = null;	
		try {
			session=factory.openSession();
			stu=(Student)session.get(Student.class, 237511); //通过get方法得到stu对象 
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			session.close();   
			//此时的stu为离线状态
		}
		try {
			session=factory.openSession();
			session.beginTransaction();   //开启事务
			session.update(stu);          //把stu从离线状态,变为持久化状态 
			stu.setName("王五二");        
			session.getTransaction().commit();  //提交事务
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			session.close();
		}
	}

 上面代码运行后的结果:

 

ID NAME PASSWORD AGE ADDRESS BIRTHDAY
237511  王五二    123 20 吉林 17-8月 -11 02.01.27.421000 下午

 

思考:你可能会发现,stu.setName("王五二");  在 session.update(stu); 之后,但数据确实是同步到数据库了,这就是我们上面所说的持久化对象的状态发生变化时,hibernate会自动将它同步到数据库。其实这里的update方法并不是发出upate语句,而是将stu从离线状态,变成持久化状态。

 

 

 

 

0
3
分享到:
评论

相关推荐

    精通Hibernate:Java对象持久化详解.zip

    《精通Hibernate:Java对象持久化详解》是一本深入解析Hibernate技术的专著,它主要针对Java开发者,旨在帮助他们理解和掌握Java对象持久化的精髓。Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了...

    精通Hibernate:Java对象持久化技术详解

    在Java应用开发中,对象持久化是一个关键环节,它涉及将程序中的对象状态存储到持久化介质(如关系型数据库)中,并在需要时恢复这些状态。Hibernate作为ORM(对象关系映射)框架,通过提供一种面向对象的方式来处理...

    精通Hibernate:Java对象持久化技术详解.pdf

    《精通Hibernate:Java对象持久化技术详解》这本书深入剖析了Hibernate这一流行的Java对象关系映射(ORM)框架,旨在帮助开发者全面理解并熟练掌握Hibernate的使用。Hibernate是Java开发中的重要工具,它简化了...

    精通Hibernate:Java持久化对象技术详解[第二版]

    8. **实体生命周期**:详解Hibernate对对象状态的管理,包括瞬时态、持久态、游离态和脱管态,以及对象状态转换和事件监听器。 9. **多态和继承映射**:讲解如何处理类的继承关系,实现多态查询,包括单表继承、...

    精通 Hibernate:Java 对象持久化技术详解 第2版

    精通 Hibernate:Java 对象持久化技术详解 第2版 学习Hibernate必备得一本书

    精通 Hibernate_Java 对象持久化技术详解(第2版).pdf

    精通 Hibernate_Java 对象持久化技术详解(第2版).pdf

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1

    一共有三个分卷。全部下载才能解压。 这本书不错,值得一看。

    hibernate持久化技术详解.孙卫琴.代码2

    **hibernate持久化技术详解** Hibernate是一款强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用中操作数据库的强大工具。通过Hibernate,开发者可以将数据库操作转化为对Java对象的操作,大大降低了...

    hibernate:java持久化对象详解02

    本教程“hibernate:java持久化对象详解02”是系列教程的一部分,它将继续深入探讨Java中的持久化对象与Hibernate的使用方法。在开始之前,建议先学习“hibernate:java持久化对象详解01”,以确保对基础概念有清晰的...

    精通Hibernate:Java对象持久化技术详解(第2版)源码2

    精通Hibernate:Java对象持久化技术详解(第2版)源码精通Hibernate:Java对象持久化技术详解(第2版)源码精通Hibernate:Java对象持久化技术详解(第2版)源码精通Hibernate:Java对象持久化技术详解(第2版)源码

    精通Hibernate:Java对象持久化技术详解(第2版)源代码

    精通HibernateJava对象持久化技术详解(第2版)jar文件.zip) annotations-api.jar antlr-2.7.6.jar catalina-ant.jar catalina-ha.jar catalina-tribes.jar catalina.jar commons-collections-3.1.jar commons-...

    精通Hibernate:Java对象持久化技术详解(第2版)源码1

    《精通Hibernate:Java对象持久化技术详解(第2版)》是一本深入解析Java对象持久化框架Hibernate的专业书籍。源码文件涵盖了多个章节,包括chapter1到chapter10,这表明该书通过实例代码详细讲解了Hibernate的核心...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    hibernate:java持久化对象详解01

    本教程“hibernate:java持久化对象详解01”聚焦于理解Hibernate如何将Java对象持久化到数据库中。 首先,让我们了解一下什么是持久化对象。在Java中,持久化对象是指那些状态可以被保存到持久存储介质(如数据库)...

    (高清版)精通 Hibernate_Java 对象持久化技术详解(第2版).pdf

    - **概念**:对象持久化是指将程序中的对象状态保存到外部存储介质的过程,以便在系统重启后仍然可以恢复这些对象的状态。 - **实现方式**:在Java中,常见的对象持久化方式包括使用Java序列化机制、XML文件、数据库...

    精通 Hibernate:Java 对象持久化技术详解(第2版)

    精通 Hibern一本ate:Java 对象持久化技术详解(第2版)是

    hibernate持久化技术详解.孙卫琴.代码1

    《Hibernate持久化技术详解》是孙卫琴老师关于Java领域中ORM(对象关系映射)框架Hibernate的一部经典教程,其“代码1”部分着重于实际操作和实践应用。Hibernate作为一个强大的工具,允许开发者通过面向对象的方式...

    Hibernate 数据持久化

    **Hibernate 数据持久化详解** Hibernate 是一款开源的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据,而无需过多关注底层的SQL语句。本篇文章将...

Global site tag (gtag.js) - Google Analytics