调用 merge() 通常是比 update() 更安全的替代方法吗?
作为避免非唯一对象异常的一种方式,是的。我认为这解释了为什么JPA不允许更新方法。
使用 merge() 而不是 update() 的缺点是什么?
未通知的用户可能认为他或她有一个新的托管实体。类似的东西
// myEntity (passed as parameter does not become managed)
// Only the one returned by the merge operation is a managed entity
session.merge(myEntity);
// "newValue" is not commited because myEntity is not managed
myEntity.setMyProperty("newValue");
如果您的持久性上下文不包含您的实体,则可能不希望在更新之前选择默认行为。但它是可以避免的
- 添加版本(@Version)列。0 或 NULL 版本表示实例是新的,必须插入,而不是更新
- 使用休眠拦截器
- 如果确定要更新而不是插入,可以使用以下方法
...
public void updateMyEntity(MyEntity updateableMyEntity);
// load does not hit the database
MyEntity myEntity = (MyEntity) session.load(MyEntity.class, updateableMyEntity.getId());
BeanUtils.copyProperties(myEntity, updateableMyEntity);
}
这样,您就可以在不合并或更新方法的情况下更新实体。有关详细信息,请参阅此问题:在 Hibernate 上更新分离对象的某些字段的最佳方法?