实体对象的三个状态

展开阅读全文

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

02-28

我看了一些文章和资料,有关讲解hibernate对象三个状态的,很多都在说 持久化状态的对象处于session管理当中,并且被持久化在数据库中。这句话前半句我能理解,但是后面半句我不能理解。rnhibernate在进行对数据库变动操作的时候是需要进行事务提交的,那么为什么说持久状态的对象会被保存在数据库中?我只save,但是不commit,也能被持久化到数据库?断点调试结果显然是NO。我这里有两个问题通过一个代码来问吧。rn然后我做了个实验rn[code=java]rnpublic static void main(String[] args) rn // TODO Auto-generated method stubrn Session session = HibernateUtil.openSession();rn Transaction trans = null;rn try rn trans = session.beginTransaction();rn Employee employee = new Employee("隔壁老王","585476990@qq.com",new Date());rn session.save(employee);rn employee.setName("小熊");rn employee.setEmail("124687990@qq.com");rn trans.commit();rn rn catch (Exception e) rn // TODO Auto-generated catch blockrn if(trans!=null)rn trans.rollback();rn e.printStackTrace();rn finallyrn if(session!=null||session.isOpen())rn session.close();rn rnrn rnrnrn[/code]rnrn大致说下这段代码,就是我已开始new一个对象先放着,这时候是瞬时态,然后我save了这个对象,变成了持久态;之后我企图修改这个对象,然后我在控制台上发现打出了三条语句:rnHibernate: select max(id) from employeernHibernate: insert into employee (name, email, hiredate, id) values (?, ?, ?, ?)rnHibernate: update employee set name=?, email=?, hiredate=? where id=?rn第一个不用说就是查询当前主键的最大值这个貌似是increment策略有的吧(不太了解先不管)rn然后第二个我也能理解了,提交完事务肯定要执行save要执行的活儿就是insert。rn但是第三个我有点奇怪了。正因为我在这里感到疑问才会提出 persistent状态的对象为什么说会被持久化到数据库 的疑问。rnrn问题:rn1.如果是资料上说的,那么我先前断点调试的时候save完成过后为什么数据库没有数据?rn2.persistent状态的对象在进行修改后,应该会和session级缓存的对象进行对比吧,要是这样在缓存里面比较完了就直接修改session中的那一份对象,然后最终一期insert到数据库,为什么后面还一个update?我的意思好比写作文的时候我们都是写草稿上,写完了检查一下,如果觉得那里不太对,在这个草稿改改然后确定了誊写到卷面,而不是写到卷面又想改了再改卷面。hibernate也应该是先该缓存然后再一起提交数据吧?否则的话相当于多了一个队数据库的操作,这样缓存的意义不就弱了吗?rnrn我是hibernate新手,学了第三天,看视频和书,感觉讲的都让我有点迷乱才来问大家,所以我肯定不是一个已经完全理解hibernate的人,所以我的理解中要是有错或者完全不着边的想法,还请大家体谅。并予以纠正,我会很感谢大家[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/83.gif][/img]rn 论坛

没有更多推荐了,返回首页