当前位置: 首页 > 面试题库 >

Hibernate:merge()在update()上的缺点

洪飞龙
2023-03-14
问题内容

我在NonUniqueObjectExceptionHibernate抛出问题上遇到了问题。

阅读文档和这篇]博客文章,我替换了从update()到的调用merge(),它解决了问题。

我相信我了解例外的原因,以及为什么更改方法可以解决不相关对象和会话边界方面的问题。

我的问题是:鉴于merge()始终将解析为会话对象,或者如果它不存在,则将其检索,因此调用merge()通常是比update()

使用merge()over 的缺点是update()什么?


问题答案:

调用merge()通常比update()更安全吗?

作为避免NonUniqueObjectException的一种方法,可以。我认为这可以解释为什么JPA不允许使用更新方法。

在update()上使用merge()的缺点是什么?

未经建议的用户可能会认为他或她拥有新的管理实体。就像是

// 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版本 表示实例是新实例 ,必须插入而不是更新
  • 使用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);

}

这样,您无需合并或更新方法即可更新实体。有关更多信息,请参见此问题:在Hibernate上更新分离对象的某些字段的最佳方法?



 类似资料:
  • 问题内容: Hibernate抛出问题。 阅读文档和这篇博客文章,我替换了从到的调用,它解决了问题。 我相信我理解例外的原因,以及为什么更改方法可以解决对象断开连接和会话边界方面的问题。 我的问题是:鉴于始终将解析为会话对象,或者如果它不存在,则将其检索,因此调用merge()通常是比? 使用over有什么缺点? 问题答案: 调用merge()通常比update()更安全吗? 作为避免NonUni

  • 问题内容: 我正在尝试用我所在国家的地理位置填充数据库。我的一张表有4个字段:ID [PK],纬度。经度和地理点 即时通讯收到以下错误:错误代码:1416无法从您发送到GEOMETRY字段的数据中获取几何对象 我很确定’geoPoint’字段是具有空间索引的POINT字段。我错过了什么吗?14 问题答案: 尝试执行此操作,而不将您的值分配给服务器值。尤其是当它们包含函数调用时。MySQL将变量的内

  • 我有一个程序,我认为,它最初是用Oracle Forms 6i编写的。不久前,我将其迁移到11g。我们的用户通过其Windows 7计算机上的Internet Explorer浏览器访问此Oracle Forms程序。 问题在于,当我们的用户在他们的机器上安装了Java6Update45时,这个程序似乎只对我们的用户运行良好。转到新版本会导致问题。 今天,我想解决这个问题,所以我把我的电脑更新到J

  • 问题内容: 我正在尝试创建一个小的测试应用程序,该应用程序读取FileStream的块并将其附加到SQL Server 2005 Express的VarBinary(max)列中。 一切正常,该列将按预期的方式填充,但我的机器似乎仍将所有内容缓冲到内存中,而我只是看不到为什么。 我正在使用以下代码(C#): 谁能告诉我为什么它将文件缓冲到内存中?我正在使用的缓冲区大小几乎只有2 MB。 我可以为每

  • 我对角是新手。我正在学习角形式,尽管我从教程中复制了下面的代码,但我仍然得到了错误:

  • 问题内容: 我有另一个线程在“缺少zlib”上寻求帮助。有了很好的帮助,问题已解决(几乎)。 现在,我对自己构建Python(在Ubuntu 10.10上)感兴趣。 一些重要的问题引起了我的注意: 构建Python(例如2.7.1)之后,如果缺少模块,是否需要重新构建Python? 有没有一种方法可以在构建Python之前找出缺少的模块?说sqlite3。我已为系统默认值(Python 2.6.6