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的人,所以本人的理解中要是有错或完全不着边的想法,还请大家体谅。并予以纠正,本人会很感谢大家