hibernate中的session几种状态

本文深入探讨了在使用Hibernate框架时,如何通过Session管理对象的状态变化,从新对象到数据库的持久化过程,以及如何在不同Session状态之间进行对象的查询、保存和更新操作。

  我不喜欢把一些理论当理论来记,那样感觉好无趣,生活应当充满乐趣,学习也应如此。

  首先我将session想成是一个大的容器,这个当然是随便我们怎么想了。而对于session中的几种状态,我喜欢这样来区分,在session中和在session外。刚new出来的对象在session外,经过查询和保存(好多方法了)的对象在session中,经过驱赶方法后的对象在session外。我觉得这样对于我理解执行这些方法时sql语句的产生有很大的帮助。

  下面用几个代码片段来分析一下上面说的。主键的生成策略( <generator class="identity" />)

//Hibernate: insert into test.person_ (pname, psex) values (?, ?)
public void save(){ Session session = factory.openSession(); session.getTransaction().begin();
        //在session外 Person person = new Person(); person.setPname("大崔"); person.setPsex("男");    //经过save方法到session中 session.save(person);    //事物提交时刷新到数据库 session.getTransaction().commit(); session.close(); }

 

 

//Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.psex as psex0_0_ from test.person_ person0_ where person0_.pid=?	
public void save3(){ Session session = factory.openSession(); session.getTransaction().begin();
        //经过查询方法后在session中,且数据库中person的sex属性是“男” Person person = (Person) session.get(Person.class, 5L);
        //在session中修改后还是在session中,且并没有真正的修改sex属性 person.setPsex("男");
        //因此此时的update不会执行 session.update(person); session.getTransaction().commit(); session.close(); }

 

//Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.psex as psex0_0_ from test.person_ person0_ where person0_.pid=?
//Hibernate: update test.person_ set pname=?, psex=? where pid=?
public void save6(){ Session session = factory.openSession(); session.getTransaction().begin();
    //经过查询方法后在session中,且数据库中person的sex属性是“男” Person person = (Person) session.get(Person.class, 5L);
    //在session中修改后还是在session中,且此时真正的修改sex属性(相对于session中的person) person.setPsex("女");
    //所以此时会执行update方法 session.update(person); session.getTransaction().commit(); session.close(); }

 

	public void update3(){ 
		Session session = factory.openSession();
		session.getTransaction().begin();
		Person person = new Person();
		person.setPid(1L);
		//此时session中并没有person,因此对于每一个需要跟新的person,session都会认为是新的,因此会每次都执行update方法
		session.update(person);
		
		session.getTransaction().commit();
		session.close();
	}

 

转载于:https://www.cnblogs.com/Jc-zhu/p/4527155.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值