为什么Hibernate Save会更新记录?

时间:2014-10-22 14:45:57

标签: java hibernate

在hibernate中,session.save()应该保存记录。它会生成“插入”查询。但是,我在下面写了简单的程序来检查这个。我观察save()也可以用来更新记录。它正在生成“更新”查询。是不是save()在下面的程序中执行与saveorupdate()相同的工作?

SessionFactory sf = conf.buildSessionFactory();
Session session = sf.openSession();
Transaction trans = session.beginTransaction();

Vehicle veh = new Vehicle();
veh.setId(1);
veh.setModel("Veh_mod");
veh.setName("Veh_Name");

Serializable obj =  session.save(veh);  
veh.setModel("Veh_mod_change");

obj =  session.save(veh);

session.flush();
trans.commit();
session.close();

-------------------------在控制台------------------- -------------

休眠:     / *插入com.anvesh.test.Vehicle         */ 插入         成             车辆             (名称,型号,ID)         值             (?,?,?)

休眠:     / *更新         com.anvesh.test.Vehicle * / update             车辆         组             NAME =?             MODEL =?         哪里             ID =?

3 个答案:

答案 0 :(得分:1)

第一次调用save()后,对象veh成为附加对象(又称持久对象状态)。随后使用setModel()变更该对象并提交事务将导致hibernate触发更新,即使不再次调用save()

以下是一个参考示例:http://www.dineshonjava.com/p/transient-persistent-and-detached.html#.VEfGCme8G7E

或许是一个简短的视频教程:http://javabrains.koushik.org/tutorials/hibernate_run/Hibernate-Tutorial-22---Transient,-Persistent-and-Detached-Objects.html

答案 1 :(得分:1)

如果在它保存的对象上设置了id,则

save()可以进行更新。查看this thread以了解各种保存方法之间的差异。引用已接受的答案

  

save保留实体。如果一个标识符不存在,将分配标识符。如果有的话,它本质上是在进行更新。返回生成的实体ID。

答案 2 :(得分:0)

当您第一次调用session.save(veh)时,您的对象将与会话关联。 然后Hibernate会知道它需要使用" UPDATE"再次保存对象时查询。

尝试:

Vehicle veh1 = new Vehicle();
veh1.setId(1);
veh1.setModel("Veh_mod");
veh1.setName("Veh_Name");

Vehicle veh2 = new Vehicle();
veh2.setId(1);
veh2.setModel("Veh_mod");
veh2.setName("Veh_Name");

session1.save(veh1);
session2.save(veh2); // try changing this to session2.saveOrUpdate()

然后你会看到session.save()和session.saveOrUpdate()

之间的区别