Hibernate:更新对象的最佳方式

时间:2012-01-30 05:10:14

标签: java hibernate

让我们说我有:

// all objects have valid mapping to database
public class A {
   private int id;
   private String name;
   private List<B> chidlren1;
   private List<C> children2;
}

在我的控制器的更新方法中,我必须更新一个特定的对象,但是它的新值我存储在会话变量中,就像另一个A对象一样。

所以问题是从另一个对象更新该特定对象的有效方法是什么? 下一个代码是否有效?

A old = dao.get(id);
A temp = getFromSession();

old.Name = temp.Name;
old.Children1 = temp.Children1;
old.Children2 = temp.Children2;
dao.update(old);

另一个问题 - 如果previoud方法是正确的,那么hibernate会先从chidlren的表中删除所有记录并添加一个新记录,还是可以自动更新/插入新记录并删除已删除的记录?

谢谢

UPD#1:让我们说chidlren temp的收藏与旧的收藏品有什么不同?

2 个答案:

答案 0 :(得分:2)

如果在类型为AB的子实体集合上正确设置了ID,并且您已在这些实体上指定了cascade=MERGE,那么您应该可以使用{{3}方法,例如,

A updatedEntity = dao.merge(yourObjectFromTheHttpSession);

也就是说,我必须手动协调相关的集合以正确处理新的传入实体并删除过去的现有实体,并且无法依靠hibernate自动处理所有事情,所以YMMV。

来自文档:

  

将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与会话关联的持久性实例,则将加载该实例。返回持久化实例。如果给定实例未保存,请保存副本并将其作为新的持久实例返回。给定的实例不会与会话关联。如果使用cascade =“merge”映射关联,则此操作会级联到关联的实例。

     

此方法的语义由JSR-220定义。

答案 1 :(得分:0)

我同意拉克什的观点。 如果你仍然怀疑中止它,你可以设置“show_sql = true”(一个hibernate propety),你会看到sql字符串。