Hibernate操作对象

本文详细解析了Hibernate中对象的四种状态:临时、持久化、删除和游离,并介绍了Session的常用方法,包括save、load与get的区别、update与saveOrUpdate的使用场景、merge方法解决更新冲突以及delete方法的正确应用。
摘要由CSDN通过智能技术生成

一、Hibernate四种对象操作

临时状态 :    

       Class c1=new Class(); // 临时对象1
        c1.setName("08计本");
        
        Class c2=new Class();  // 临时对象2
        c2.setName("09计本");

7bc35e76599a55dd35329318e391232ef18.jpg

持久化状态:  放到了session缓存中

        session.save(c1); // 持久化对象
        session.save(c2); // 持久化对象

// 提交事务才执行sql语句,此时数据还不在数据库中,

session.getTransaction().commit(); //提交事务

8fb9f92fc69a11611ec27271322912d20f4.jpg

删除状态:session.delete(h);

 session.delete(c2); // 删除对象

  session.getTransaction().commit(); // 提交事务
        session.close(); // 关闭session
        System.out.println(c2.getName()); // 删除对象

0d7b56aefed3af5d8d05ce969c395f6b1c1.jpg

游离状态:数据已经持久化,但不在session中

 
        session.getTransaction().commit(); // 提交事务
        session.close(); // 关闭session
        
        System.out.println(c1.getName()); // 游离对象,可以打印出来

61a08d2fe0592281c4b28607119c18534f1.jpg

 

97500685dab4b80789c23441843aa204cd8.jpg

二、Session常用方法

0f0a5aea2d12817d46b2f94da5c4f361dbf.jpg

1.save(临时对象变持久化对象)

 

2.load() VS get()

用法:获取对象是为了删除它用load(),获取对象是为了访问它的属性,用get()

e11fe69078682b60e85be26e0750a4110ba.jpg

现在数据库有一条数据

f09bd82162e579db649ffb95d8e1d560208.jpg

load()

Class c=(Class)session.load(Class.class, Long.valueOf(2));

        System.out.println(c);

报错

35b6b158b5a72b5c8f906d808dcec2c8e61.jpg

get()

Class c=(Class)session.load(Class.class, Long.valueOf(2));

        System.out.println(c);

值为空

a87054ef11169749e398544434f0dde51e3.jpg

d7e3bdf66e5b220b80bf1e73d49996ca372.jpg

延迟加载

打断点执行了Class c=(Class)session.load(Class.class, Long.valueOf(1));

但数据库还是没有取到值

37351fdc2384d63abdf26a23b85aaf4a133.jpg

5fdffa72fbaa48f3a400c5b4700d5789d07.jpg

 

立即检索策略

执行Class c=(Class)session.get(Class.class, Long.valueOf(1));就从数据库取到值了

13e30ca33712e47c66cb1bdfa0ec74a35fd.jpg

3.update():游离对象变成持久化对象

	@Test
	public void testSaveOrUpdateClass(){
		//更新操作
		Session session1=sessionFactory.openSession();
		session1.beginTransaction();//开启事务
		Class c=(Class)session1.get(Class.class, Long.valueOf(1));
		session1.getTransaction().commit(); // 提交事务
		//关闭session,c从持久化对象变成游离对象
		session1.close();
		
		Session session2=sessionFactory.openSession();
		session2.beginTransaction();
		c.setName("08计算机本科2");
		//加游离对象变成持久化对象,更新数据库
		session2.update(c);
		session2.getTransaction().commit(); // 提交事务
		session2.close();
	}

原本数据f09bd82162e579db649ffb95d8e1d560208.jpg,更新之后d5def73f447c07ee747b515da4778b688db.jpg

4.saveOrUpdate()

包含了save()方法和update()方法,就是说如果对象是临时状态就使用save(),是游离状态就使用update()。

       @Test
	public void testSaveOrUpdateClass(){
		Session session1=sessionFactory.openSession();
		session1.beginTransaction();
		Class c=(Class)session1.get(Class.class, Long.valueOf(1));
		session1.getTransaction().commit(); // 提交事务
		session1.close();
		//c是游离对象saveOrUpdate(c);执行更新操作
		Session session2=sessionFactory.openSession();
		session2.beginTransaction();
		c.setName("08计算机本科3");
		//c2是对象临时对象,saveOrUpdate(c);执行添加操作

		Class c2=new Class();
		c2.setName("09计算机本科3");

		session2.saveOrUpdate(c);
		session2.saveOrUpdate(c2);
		session2.getTransaction().commit(); // 提交事务
		session2.close();
	}

原数据库:d5def73f447c07ee747b515da4778b688db.jpg改变后数据库:2856b2697244f717e1dd8219e2ca31ec85d.jpg

5.merge()方法

有时更新操作会遇到这样报错

374e61905cbdf9d24b66c6c73754532dd94.jpg

	@Test
	public void testMergeClass(){
		Session session1=sessionFactory.openSession();
		session1.beginTransaction();
		Class c=(Class)session1.get(Class.class, Long.valueOf(1));
		session1.getTransaction().commit(); // 提交事务
		//关闭session1
		session1.close();
		//c是OID的=1游离状态对象
		
		Session session2=sessionFactory.openSession();
		session2.beginTransaction();
		
		//session2中获取一个OID的=1的对象持久化对象,放到session2中
		Class c2=(Class)session2.get(Class.class, Long.valueOf(1));
		c.setName("08计算机本科4");
	    
		//执行这句时,将游离状态的c放到session2中
		//这样session2就会有两个OID=1的对象,就会报错,更新失败
		session2.update(c);

		session2.getTransaction().commit(); // 提交事务
		session2.close();
	}
	

使用merge()方法,可以解决,就是说调用merge可以发现session中有两个OID相同的对象,使两个对象合并再进行更新

更新操作使用merge()比update()好

 

6.delete()方法

        @Test
	public void testDeleteStudent(){
		//删除用load,提高性能
		Student student=(Student)session.load(Student.class, Long.valueOf(1));
		session.delete(student);
		//	session1.getTransaction().commit();  执行提交事务才删除数据库数据
	}

 

 

转载于:https://my.oschina.net/u/3848699/blog/2239742

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值