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

休眠: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抛出问题上遇到了问题。 阅读文档和这篇]博客文章,我替换了从到的调用,它解决了问题。 我相信我了解例外的原因,以及为什么更改方法可以解决不相关对象和会话边界方面的问题。 我的问题是:鉴于始终将解析为会话对象,或者如果它不存在,则将其检索,因此调用merge()通常是比? 使用over 的缺点是什么? 问题答案: 调用merge()通常比update()更安全吗?

  • 问题内容: 因此,我了解设置此属性 dynamic-update = true会 做什么,即,它仅考虑那些已修改的字段,并省略了为其他字段设置空值的工作。 节省开销,性能良好。 出于好奇而问:hibernate如何知道所有字段都被修改了?在触发更新查询之前,它是否先将选择查询生成的结果与数据库进行比较?假设是,那么比较不是性能的开销吗? 如我错了请纠正我。提前致谢! 问题答案: 因此,经过将近两个

  • 问题内容: 有一个“ Item”类,它有一些相关的类,称为Vehicle,Vmodel,Category,ItemName,Brand,SizeModel。每个类都有属性ID和名称(例如Vehicle类,“ vid”和“ vname”)。 Item类具有itemcode。 另外,我还需要从给定的示例Item对象(称为“ ”)中获取Item对象,该对象等于我的示例item对象的属性以及与该对象关联的

  • 问题内容: 这是hibernate.cfg.xml中的内容 另外,我正在动态覆盖某些属性… 但是,当我运行它时,出现此错误… 如何配置属性,以便heroku找到postgres驱动程序? (我是hibernate和Heroku的新手,因此非常感谢您的帮助:) 问题答案: 来自Heroku Postgres的URL格式不是JDBC格式。它是一种多语言格式,因此所有平台都可以使用它。因此,您需要将UR

  • 问题内容: 我有一个hibernate映射,该映射一直工作到最近-尽管我确定这是我所做的某些更改的结果,但我似乎找不到它。 映射文件将字段定义为: 该类将该字段定义为: 运行此代码时,出现以下错误: 与此对应的数据库字段定义为: 我还有其他几个具有相似结构和定义的类,并且它们没有问题。但是,可能由于我最近所做的一些更改而导致,此特定映射将不再正常工作。 有什么建议么? 问题答案: 我不确定,但是您

  • 问题内容: 我收到了一个我无法解释的奇怪的Hibernate异常。告诉我我正在使用二级缓存,但是没有在哪里指定二级缓存。这是例外: 而我的: 有什么想法会触发此异常吗?提前致谢! 问题答案: Pau在hibernate.cfg.xml中写了hibernate.cache.region.factory_class: 唯一的例外是不言而喻的。您必须设置 属性。例如,使用ehcache将添加以下行: n