Hibernate---对象的三种状态
来源:互联网 发布:源码资本投资的项目 编辑:程序博客网 时间:2024/05/24 03:26
Hibernate---对象的三种状态
1、Hibernate对象有三种状态,分别是:临时态(瞬时态)、持久态(同步态)、游离态(托管态);以下定义引用别人的话:
临时态:当new一个实体对象后,这个对象处于临时状态,即这个对象只是一个保存临时数据的内存区域,如果没有
变量引用这个对象,则会被jre垃圾回收机制回收。这个对象所保存的数据与数据库没有任何关系,除非通过Session
的save或者SaveOrUpdate把临时对象与数据库关联,并把数据插入或者更新到数据库,这个对象才转换为持久对象。
瞬时对象具有如下特点:
1、在数据库中没有与之关联的记录
持久态:持久化对象的实例在数据库中有对应的记录,并拥有一个持久化表示(ID)。对持久化对象进行delete
操作后,数据库中对应的记录将被删除,那么持久化对象与数据库记录不再存在对应关系,持久化对象
变成临时状态。
持久对象具有如下特点:
1. 和session实例关联;
2. 在数据库中有与之关联的记录。
游离态: 当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session
上时,并再次转变成持久对象。脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。
脱管对象具有如下特点:
1. 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
2. 比瞬时对象多了一个数据库记录标识值。
三者之间的转换方式如下图所示:
下面,我们来演示一个实例:
1、新建一个Java工程,添加Hibernate 3.3支持
2、选中t_user表进行反向生成,在src生成下生成com.etc.dao包,在包下自动生成TUser.java和TUser.hbm.xml文件
public class TUser implements java.io.Serializable {private Integer id;private String username;private String password; getter/setter()方法}
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping> <class name="com.etc.dao.TUser" table="t_user" catalog="test"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="native" /> </id> <property name="username" type="java.lang.String"> <column name="username" /> </property> <property name="password" type="java.lang.String"> <column name="password" /> </property> </class></hibernate-mapping>
3、配置hibernate.cfg.xml文件<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools. --><hibernate-configuration><session-factory><property name="current_session_context_class">thread</property><property name="show_sql">true</property><property name="format_sql">true</property><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="connection.url">jdbc:mysql://localhost:3306/test</property><property name="connection.username">root</property><property name="connection.password">root</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="myeclipse.connection.profile">com.mysql.jdbc.Driver</property><mapping resource="com/etc/dao/TUser.hbm.xml" /></session-factory></hibernate-configuration>
4、在工程下新建test文件夹,在文件夹下新建com.etc.dao包,在包下新建TUserDAOTest.java类:package com.etc.dao;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;public class TUserDAOTest {@Testpublic void test1(){//1、得到数据库映射SessionFactorySessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();//2、得到数据库连接Session session = sessionFactory.getCurrentSession();//3、开启事务session.beginTransaction();//4、进行数据库相关的操作//对象的第一种状态:临时态:刚刚被new出来的对象,跟hibernate无关TUser tuser = new TUser();tuser.setUsername("zoey");tuser.setPassword("123");//临时态--->对象的第二种状态:持久态:调用session的save()或者saveOrUpdate()方法之后,不需要update,
会自动同步到数据库(直接调用对象的set方法就可以)//持久态:受hibernate管理,在数据库中有相应的数据session.save(tuser);tuser.setUsername("aaaa");System.out.println(tuser.getId());//持久态--->对象的第三种状态:游离态:持久态调用session的evict()或者close()或者clear()方法之后,
不受hibernate管理,但数据库中有对应的数据session.evict(tuser);//tuser.setUsername("bbb");//这行代码不会生效System.out.println(tuser.getId());//5、提交事务session.getTransaction().commit();}@Testpublic void test2(){//1、得到数据库映射SessionFactorySessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();//2、得到数据库连接Session session = sessionFactory.getCurrentSession();//3、开启事务session.beginTransaction();//4、进行数据库相关的操作//持久态:直接调用session的get()或者load()方法TUser tuser = (TUser)session.get(TUser.class,4);tuser.setPassword("pass");//持久态--->临时态session.delete(tuser);tuser.setPassword("aa");//这行代码不会生效//临时态--->持久态session.save(tuser);//持久态--->游离态session.clear();//5、提交事务session.getTransaction().commit();}}总结:
1、临时态:就是刚刚new出来的对象,通过对象的set()方法改变对象的属性值,但不会真的同步到数据库中,也就是
和数据库无关。只有调用session.save()方法之后,变成持久态,使用set方法改变对象的属性值,才会真的同步到数
据库。持久态调用session.delete()方法之后,变成临时态。临时态不受hibernate的管理,并且在数据库中没有对应
的数据。
2、持久态:临时态调用session.save()或者session.saveOrUpdate()方法之后,就会变成持久态;或者通过调用
session.get()或session.load()方法之后就会变成持久态;对象变成持久态之后,只需要通过类的set方法就可以改
变对象的属性值,并且直接更新到数据库,并不需要调用什么update方法。持久态受hibernate的管理,并且在数据库
中有对应的数据。
3、游离态:持久态调用session.evict()或者session.close()或者session.clear()方法就可以变成游离态。变成游
离态之后,不受hibernate管理,但是在数据库中还有对应的ID字段。
- Hibernate的对象的三种状态
- Hibernate的对象的三种状态
- Hibernate的三种对象状态
- hibernate对象的三种状态
- hibernate 实体对象的三种状态
- hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- hibernate的三种对象状态
- Hibernate对象的三种状态
- Hibernate对象的三种状态
- Hibernate数据对象的三种状态
- Hibernate对象的三种状态
- Hibernate的三种对象状态
- Hibernate对象的三种状态是什么
- 百练_3255:十进制到六进制
- js拖放排序和分类插件
- 自动部署脚本Linux+SVN+Maven
- Shell 之 if
- Android 使用极光推送集成、出现问题和后台保活
- Hibernate---对象的三种状态
- Linux内核分析-7/程序的装载(基于fork)
- 制作framework
- HDU6034Balala Power
- 算法导论 学习笔记 第一章
- 软件测试中的冲突测试
- angularJS <input type="file> 图片的base64编码
- 【牛腩新闻发布系统】——母版页与web控件
- 如何将linux英文版系统转换为中文版系统