博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hibernate持久化类以及相互转化
阅读量:3907 次
发布时间:2019-05-23

本文共 4695 字,大约阅读时间需要 15 分钟。

持久化类的三种状态

持久化类:

定义: 持久化类: javaBean + 和底层数据库表创建了映射关系:
特点:
(1)无参数构造器: 底层通过反射, 创建实体bean
(2)提供属性, 属性提供get set方法:
(3)必须Serializable接口:
(4)实体类当中必须同一个OID :
总结: java 当中通过地址值:
数据库:主键:
Hibernate: OID
(5) 不能使用final修饰:
(6) 属性尽量使用包装字段:

Hibernate是持久层框架, 通过持久化类完成ORM操作。 Hibernate为了更好的管理持久化类, 将持久化类分为三个状态。

持久化类 = java类 + 映射:

1:瞬时态

一般对象刚创建出来的时候的状态
这种对象没有唯一的OID,没有被session管理, 称之为瞬时态对象。
2:持久态
对象被保存后的状态
这种对象有唯一的表示OID,被session管理,称之为持久化对象。
持久化类的持久态的对象, 可以自动更新数据库。
3:托管态
session关闭之后的对象的状态
这种对象具有唯一的OID,没有被session管理,称之为托管态对象。
1.4.1.4:代码演示对象的几个状态
/*

  • 测试持久化类对象的三个状态:

    */
    public class TestDemo02 {

    public static void main(String[] args) {

    Session session = HibernateUtils.openSession();
    Transaction tx = session.beginTransaction();

    Customer cus = new Customer();//瞬时状态, 没有唯一的OID, 没有被session管理: cus.setCust_name("毕从明");  Serializable save = session.save(cus);//持久态对象, 具有唯一的表示OID, 同时也被session管理: System.out.println(save);//添加操作: 返回是当前对象的id的值:   tx.commit();  session.close(); System.out.println(cus.getCust_name());// 托管状态, 有唯一的OID,没有被session管理。  session已经被关闭了

    }

}

package com.yidongxueyuan;import java.io.Serializable;import org.hibernate.Session;import org.hibernate.Transaction;import org.junit.Test;import com.yidongxueyuan.domain.Customer;import com.yidongxueyuan.utils.HibernateUtils;public class TestSession {	// session.sava();	//保存: 			//展示对象的三个状态: 	@Test	public void testName() throws Exception {		Session session = HibernateUtils.openSession();		Transaction tx = session.beginTransaction();				//演示三个状态:		/*		 * 		 * 1: 改对象刚刚被初始化: 		 *  没有oid : 		 *  没有被session管理: 		 */				//瞬时态: 		Customer customer = new Customer();			customer.setCust_name("王导演");						//持久态: 		/*		 *  oid : 		 *  已经被session管理: 		 *  能够自动更新数据库:  		 */		Serializable id = session.save(customer);						/*		 * 托管:游离态		 * 		 * 具有oid :		 * 但是不被session管理:  		 */		Customer cust02 = new Customer(); 		cust02.setCust_id(1002);//具有oid  没有被session 管理: 托管态: 									tx.commit();		session.close();				System.out.println(customer.getCust_name());//customer 这个对象是一个游离态: 	}		// 持久态没有调用update 能够自动更新数据库: 	@Test	public void testName2() throws Exception {		Session session = HibernateUtils.openSession();		Transaction tx = session.beginTransaction();				//演示三个状态:	    Customer customer = session.get(Customer.class, 1L);	    customer.getCust_id();	    customer.setCust_name("fghdj");		    	    /*	     * 只有事务的提交, 没有使用session.update方法, 同样对象能够被修改。 	     * 特点: 持久态对象能够自动更新数据库:  	     * 原因: 	     *  1: Session 的以及缓存: 	     *  2: 快照区: 	     */					tx.commit();		session.close();	}			/*	 * 持久态转换成其他的状态: 	 */	@Test	public void testName3() throws Exception {		Session session = HibernateUtils.openSession();		Transaction tx = session.beginTransaction();				 /*		  * 获得持久态的方法;  通过session对象从数据库当中查询出来的对象就是一个持久态对象: 		  * get();   		  * load(); 		  * find(); 		  * iterator()... 		  * 		  */				//获得了了持久态: 		Customer customer = session.get(Customer.class, 2L);						//转换成瞬时态: //		session.delete(customer);						/*		 * 转换成游离态: 		 * 方式一: session.close方法: 		 * 方式二: session.evict(obj); 		 * 方式三; session.clear(); 		 */		session.clear();				session.evict(customer);		System.out.println(customer.getCust_name());//游离态: 					tx.commit();		session.close();						//方式一: session关闭: //		System.out.println(customer.getCust_name());//游离态: 			}			/*	 * 游离态转换成 持久态: 	 */	@Test	public void testName4() throws Exception {		Session session = HibernateUtils.openSession();		Transaction tx = session.beginTransaction();						//获得了了持久态: 		Customer customer = session.get(Customer.class, 2L);		session.clear();		System.out.println(customer.getCust_name());//游离态: 						//将游离态转换成持久态: 		session.update(customer);		session.saveOrUpdate(customer);//		session.lock(customer, lockmodel );			tx.commit();		session.close();							}		}

各个时态之间的获得以及转换(了解):

(代码在上面那个里面)

瞬时态对象
获得: Customer cust = new Customer();
状态转换:
瞬时—>持久: sava(Object obj) savaOrUpdate(Object obj)
瞬时—>托管: cus.setCust_id(1);
持久态对象
获得: get() , load() find(), iterate();
状态转换:
持久---->瞬时: delete
持久---->托管: close() , clear(), evict(Object obj);
托管态对象
获得: Customer cus =new Customer();
Cus.setCus_Id();
状态转换:
在这里插入图片描述
托管---->持久: update() savaOrUpdate(); 在第一天的修改方法。和保存方法当中可以解释,从对象的角度来分析:
托管—>瞬时: cus.setCst_id(null);
1.4.3:持久态对象的特征:
1.4.3.1:持久化类持久态对象自动更新数据库:
/*
* 演示: 持久化类持久态对象能够自动更新数据库:
*/
@Test
public void testName() throws Exception {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();

//===========	//1;获得一个持久态对象: get();	Customer customer = session.get(Customer.class, 1L);	customer.setCust_name("haha");		//2:之前需要调用update();更新数据库当中的内容:	//现在不需要调用update,数据库当中数据也会被我修改:在这儿加断点, 测试效果。	//原因: 持久化状态,会自动修改数据库。 当修改的语句和数据库完全一致, 不发送sql 语句,很智能。 	//底层: 依赖了Hibernate底层的一级缓存。 	tx.commit();	session.close();}

转载地址:http://qgmen.baihongyu.com/

你可能感兴趣的文章
以前项目中的js写法2
查看>>
以前项目中js写法3
查看>>
以前写的jsp页面内容
查看>>
以前写的jsp页面
查看>>
以前的代码1
查看>>
以前写的struts配置文件
查看>>
apache common简介1
查看>>
apache common 工具(怎样可以编写更少的代码)
查看>>
用maven构建项目
查看>>
Spring集成ActiveMQ配置
查看>>
Luence认识1
查看>>
ant项目构建
查看>>
用Ant构建Java项目
查看>>
eclipse导入ant工程
查看>>
Ant创建项目模板demo
查看>>
LUCENE入门
查看>>
inner join 和outer join知识
查看>>
如何提高数据库查询速度
查看>>
web并发访问的问题
查看>>
webWeb性能优化方案
查看>>