当spring整合hibernate以后事务就会被spring进行托管,那么当你在一个get一个对象以后在进行set对象时候你发现,事务提交后会执行一段update语句,数据库中的值也会改变,这就是动态更新。就是说,你的查询和赋值同时在一个相同的session中进行的,hibernate根据id判断是同一个对象,因此会自动更新相应的属性值。 java
其实自动更新只是为了提升效率。 如果你不想让它自动更新,大家可采起如下方法: 在映射文件相应属性中设置update="false"能够不用更新该字段或者是在映射文件中的class标签里面加上:dynamic-insert="false" spring
就像下边这样: sql
<class name="com.orm.UserInfo" table="user_info" 数据库
dynamic-update="false" session
dynamic-insert="true" spa
optimistic-lock="version">hibernate
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); session = HibernateUtil.openSession(); session.beginTransaction(); User u = new User(); u.setBorn(new Date()); u.setUsername("zhangsan"); u.setPassword("zhangsan"); session.save(u); u.setPassword("222"); //该条语句没有意义 session.save(u); u.setPassword("zhangsan111"); //没有意义 session.update(u); u.setBorn(sdf.parse("1988-12-22")); //没有意义 session.update(u); session.getTransaction().commit();
这个时候会发出多少sql语句呢?仍是一样的道理,在调用save方法后,u此时已是持久化对象了,记住一点:若是一个对象以及是持久化状态了,那么此时对该对象进行各类修改,或者调用屡次update、save方法时,hibernate都不会发送sql语句,只有当事物提交的时候,此时hibernate才会拿当前这个对象与以前保存在session中的持久化对象进行比较,若是不相同就发送一条update的sql语句,不然就不会发送update语句code
Hibernate: insert into t_user (born, password, username) values (?, ?, ?) Hibernate: update t_user set born=?, password=?, username=? where id=?
这样
orm