hibernate的事务提交和对象三个状态的问题

J2EE 码拜 9年前 (2016-03-19) 1227次浏览
本人看了一些文章和资料,有关讲解hibernate对象三个状态的,很多都在说  持久化状态的对象处于session管理当中,并且被持久化在数据库中。这句话前半句本人能理解,但是后面半句本人不能理解。
hibernate在进行对数据库变动操作的时候是需要进行事务提交的,那么为什么说持久状态的对象会被保存在数据库中?本人只save,但是不commit,也能被持久化到数据库?断点调试结果显然是NO。本人这里有两个问题通过一个代码来问吧。
然后本人做了个实验

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Session session = HibernateUtil.openSession();
		Transaction trans = null;
		try {
			trans = session.beginTransaction();
			Employee employee = new Employee("隔壁老王","585476990@qq.com",new Date());
			session.save(employee);
			employee.setName("小熊");
			employee.setEmail("124687990@qq.com");
			trans.commit();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			if(trans!=null)
				trans.rollback();
			e.printStackTrace();
		}finally{
			if(session!=null||session.isOpen())
				session.close();
		}
	}
}

大致说下这段代码,就是本人已开始new一个对象先放着,这时候是瞬时态,然后本人save了这个对象,变成了持久态;之后本人企图修改这个对象,然后本人在控制台上发现打出了三条语句:
Hibernate: select max(id) from employee
Hibernate: insert into employee (name, email, hiredate, id) values (?, ?, ?, ?)
Hibernate: update employee set name=?, email=?, hiredate=? where id=?
第一个不用说就是查询当前主键的最大值这个貌似是increment策略有的吧(不太了解先不管)
然后第二个本人也能理解了,提交完事务肯定要执行save要执行的活儿就是insert。
但是第三个本人有点奇怪了。正原因是本人在这里感到疑问才会提出  persistent状态的对象为什么说会被持久化到数据库  的疑问。
问题:
1.假如是资料上说的,那么本人先前断点调试的时候save完成过后为什么数据库没有数据?
2.persistent状态的对象在进行修改后,应该会和session级缓存的对象进行对比吧,要是这样在缓存里面比较完了就直接修改session中的那一份对象,然后最终一期insert到数据库,为什么后面还一个update?本人的意思好比写作文的时候我们都是写草稿上,写完了检查一下,假如觉得那里不太对,在这个草稿改改然后确定了誊写到卷面,而不是写到卷面又想改了再改卷面。hibernate也应该是先该缓存然后再一起提交数据吧?否则的话相当于多了一个队数据库的操作,这样缓存的意义不就弱了吗?
本人是hibernate新手,学了第三天,看视频和书,感觉讲的都让本人有点迷乱才来问大家,所以本人肯定不是一个已经完全理解hibernate的人,所以本人的理解中要是有错或完全不着边的想法,还请大家体谅。并予以纠正,本人会很感谢大家hibernate的事务提交和对象三个状态的问题

解决方案

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明hibernate的事务提交和对象三个状态的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)