java - hibernate : Downside of merge() over update()

标签 java hibernate session

我遇到了 Hibernate 抛出的 NonUniqueObjectException 问题。

阅读文档和this博文中,我将 update() 的调用替换为 merge(),问题就解决了。

我相信我理解异常的原因,以及为什么更改方法可以解决问题,就断开的对象和 session 边界而言。

我的问题是:鉴于 merge() 将始终解析为 session 对象,或者如果它不存在则检索它,调用 merge() 通常比 更安全更新()

使用 merge() 而不是 update() 有什么缺点?

最佳答案

Is calling merge() generally a safer alternative than update() ?

作为一种避免 NonUniqueObjectException 的方法,是的。我认为它解释了为什么 JPA 不允许更新方法。

What is the downside of using merge() over 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");

如果您的持久性上下文不包含您的实体,也许您不希望 select-before-updating 默认行为。但可以避免

  • 添加版本 (@Version) 列。 0 或 NULL 版本表示实例是新的,必须插入,而不是更新
  • 使用 Hibernate 拦截器
  • 如果您确定要更新而不是插入,可以使用以下方法

...

public void updateMyEntity(MyEntity updateableMyEntity);

    // load does not hit the database
    MyEntity myEntity = (MyEntity) session.load(MyEntity.class, updateableMyEntity.getId());

    BeanUtils.copyProperties(myEntity, updateableMyEntity);

}

这样您就可以在没有合并或更新方法的情况下更新您的实体。有关更多信息,请参阅此问题:Best way to update some fields of a detached object on Hibernate ?

关于java - hibernate : Downside of merge() over update(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2118257/

相关文章:

hibernate - 在 embeddable/embedded-id 中使用 hibernate 序列生成器

java - 是否可以使用多个命名查询文件

django - 修改不同Django用户的 session 数据

session - 如何在 sails.js 中使用 sails-disk 作为 session 适配器?

java - 如何检查字符串中是否只出现某些字符?

java - 在 NestedScrollView android 中添加子项时出错

java - 调用 FileWriter 的单元测试方法

java - PowerMockito : how to mock methods called by the constructor?

java - JPA:保留具有 OneToMany 关系的 2 个实体的问题

php - 打开两个连接到我的 Apache 服务器?