问题描述
各位大神,请教一个关于hibernate修改数据的问题,看代码 public void addUser(){ System.out.println("begin......."); Session session = null; Transaction transaction = null; session = SessionFactoryUtil.getSessionFactory().openSession(); transaction = session.beginTransaction(); System.out.println("开始修改用户信息"); User u = (User)session.get(User.class, 2); u.setUsername("ddTest"); session.saveOrUpdate(u); System.out.println("修改用户信息成功。。。。"); transaction.commit(); session.close(); System.out.println("end......."); }这样可以把一个ID为2的用户数据name改为ddTest,没有什么疑问。再看 public void addUser(){ System.out.println("begin......."); Session session = null; Transaction transaction = null; session = SessionFactoryUtil.getSessionFactory().openSession(); transaction = session.beginTransaction(); System.out.println("开始修改用户信息"); User u = (User)session.get(User.class, 2); u.setUsername("ddTest"); //session.saveOrUpdate(u); System.out.println("修改用户信息成功。。。。"); transaction.commit(); session.close(); System.out.println("end......."); }这样,不用saveOrUpdate,数据一样被成功修改。这是为什么呢?是事务在提交时把一级缓存里的对像flush到数据库了吗?那如果这样的话要saveOrUpdate之类的方法还有什么用呢?求高手大神解惑,小弟在此感谢。
解决方案
你没有分清Hibernate里面实体的状态,你这两个例子里面实体的状态都是“持久”的状态(都是你刚查出来的,实体是在session里面持久态的)考虑如果是从画面取来的值,设置到了实体里面,这时候这个实体是和session脱离的“瞬时”状态,这种东西用saveOrUpdate才有意义。你可以看看Hibernate的API的程序,当你传进saveOrUpdate方法的实体是一个“持久”状态的实体,那么它什么都不做的,就和你第二个例子相同。如果你传入的是一个“瞬时”态的东西,比如你新做出来的,或者从别的已经close的session里面查出来的东西,那么再调用它就有意义了。他会看ID是否有,来决定做更新还是插入,还会去检查版本号(如果你配置了版本检查的话)。。。等等一系列动作。
解决方案二:
hibernate的update方法不是sql update的替代品或者翻译。hibernate屏蔽了你直接操作数据库操作sql。update也好,直接set也好,你修改的目标都是内存中的某个对象模型,而hibernate会将这个对象的修改同步到数据库。