在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 =?
答案 0 :(得分:1)
第一次调用save()
后,对象veh
成为附加对象(又称持久对象状态)。随后使用setModel()
变更该对象并提交事务将导致hibernate触发更新,即使不再次调用save()
。
以下是一个参考示例:http://www.dineshonjava.com/p/transient-persistent-and-detached.html#.VEfGCme8G7E
答案 1 :(得分:1)
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()
之间的区别