Hibernate对象的状态,session的clear()和evict()

本文介绍Hibernate框架下如何实现对象的添加、修改等操作,并详细解释了不同状态下对象的行为差异,如临时状态、持久化状态的变化及其对数据库的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >







public class PersonTest {
	private static SessionFactory sessionFactory = null;
	
	static{
		Configuration configuration = new Configuration();
		//加载配置文件,路径为classPath下的,名字为hibernate.cfg.xml"的文件
		configuration.configure();
		//configuration.configure("/com/xxc/test/hibernate.cfg.xml");
		sessionFactory = configuration.buildSessionFactory();
	}
	
	/**
	 * 添加一个person
	 */
	@Test
	public void savePerson(){
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		
		Person p = new Person();
		p.setPname("xxc1");
		p.setPsex("man1");
		//执行save语句的时候,就是将临时状态对象改成和session有关系的持久化状态,但是并不是马上执行insert语句
		session.save(p);
		//因为修改的是持久化状态对象,所以不需要update语句,当事务提交的时候会执行update语句
		p.setPsex("女");
		
		/**
		 * 在commit的时候会发生如下两句sql操作
		 * 由save引起的:insert into Person (pname, psex, pid) values (?, ?, ?)
 		 * 由update引起的:update Person set pname=?, psex=? where pid=?
		 */
		transaction.commit();
		session.close();
	}
	
	/**
	 * 修改一个person
	 */
	@Test
	public void editPerson(){
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		//操作持久化状态的数据,修改了其中的属性,不需要update就能同步到数据库
		Person person = (Person)session.get(Person.class, 1L);
		person.setPname("皮卡丘111");
		//这句话在这里相当于废话
		//session.update(person);
		
		transaction.commit();
		session.close();
	}
	
	@Test
	public void editPerson2(){
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		
		Person p1 = new Person();//临时状态
		p1.setPname("p1");//临时状态
		p1.setPsex("man1");//临时状态
		session.save(p1);//持久化状态
		
		transaction.commit();
		session.close();//关闭session
		
		//重新开启一个session
		session = sessionFactory.openSession();
		//重新开启一个事务
		transaction = session.beginTransaction();
		//将p1对象的属性改变,但是此时的p1对象对于当前的session来说,p1是个临时对象,所以在事务提交的时候并不会执行update语句
		p1.setPname("p2");
		p1.setPsex("man2");
		//session.update(p1);//只有写了这句话,才会将p1对象与新的session关联起来,使p1成为持久化状态
		
		transaction.commit();
		session.close();
	}
	
	@Test
	public void testClear(){
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		
		Person p1 = new Person();//临时状态
		p1.setPname("p1");//临时状态
		p1.setPsex("man1");//临时状态
		session.save(p1);//持久化状态
		
		session.clear();//清空session中所有的对象
		
		transaction.commit();//所以所这里不会进行insert操作了
		session.close();
	}
	
	@Test
	public void testEvict(){
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		
		Person p1 = (Person) session.get(Person.class, 1L);//持久化状态
		p1.setPsex("不男不女");
		
		session.evict(p1);//将session中将持久化状态的p1对象改编成临时状态对象
		session.update(p1);//将p1对象从临时化状态改为持久化状态
		
		transaction.commit();
		session.close();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值