hibernate持久化类以及相互转化

持久化类的三种状态

持久化类:
定义: 持久化类: 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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方-教育技术博主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值