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

在Hibernate中重新附加分离对象的正确方法是什么?

融泓
2023-03-14
问题内容

我遇到一种情况,我需要将分离的对象重新附加到hibernate会话,尽管会话中可能已经存在相同标识的对象,这将导致错误。

现在,我可以做两件事之一。

  1. getHibernateTemplate().update( obj ) 当且仅当hibernate会话中不存在对象时,此方法才有效。当以后需要时,将引发异常,指出具有给定标识符的对象已存在于会话中。
  2. getHibernateTemplate().merge( obj ) 仅当hibernate会话中存在对象时,此方法才有效。如果我以后使用该对象,则当我需要该对象进入会话时,将引发异常

在这两种情况下,如何将会话附加到对象上?我不想使用异常来控制此问题的解决方案的流程,因为必须有一个更优雅的解决方案…


问题答案:

因此,似乎没有办法在JPA中重新附加陈旧的独立实体。

merge()会将过时的状态推送到数据库,并覆盖所有中间更新。

refresh() 不能在独立实体上调用。

lock() 无法在分离的实体上调用,即使可以,也确实将其重新连接,并使用参数LockMode.NONE调用“ lock”,这意味着你正在锁定而不是锁定是API设计中最违反直觉的部分我见过的。

所以你被困住了。有一种detach()方法,但是没有attach()reattach()。你无法使用对象生命周期中一个明显的步骤。

从有关JPA的类似问题的数量来看,即使JPA确实声称拥有一个连贯的模型,但它肯定与大多数程序员的思维模型不符,大多数程序员被诅咒浪费了很多时间试图理解如何获得JPA做最简单的事情,并最终在整个应用程序中使用缓存管理代码。

似乎唯一的方法是丢弃陈旧的分离实体,并执行具有相同ID的查找查询,这将影响L2或DB。



 类似资料:
  • 问题内容: 这个问题应该比关于更多。 我有一个子类(在python 2.7中,numpy 1.6.2),并且我发现在对象时未列出的字段名称(因此,ipython的自动完成功能无效)。 为了修复它,我尝试在子类中重写,如下所示: 结果是:。(我发现这里实际上应该在python 3.3中工作…) 作为一种解决方法,我尝试了: 据我所知,这是可行的,但当然并不优雅。 问题: 后一种解决方案对我而言是否正

  • 问题内容: 我想知道在Java上使用HB更新分离对象的某些字段的最佳方法是什么。特别是当对象具有子对象属性时。例如(删除注释并减少字段数以减少噪声): 在MVC Web 应用程序中更新父级时,我可以使用 Session.get(Parent.class,123) 调用父级实例,使用它来填充表单并显示它。没有DTO,只有分离的父级传递到视图并绑定到表单。现在,我只想允许用户更新父级的 field2

  • 问题内容: 在Java对象中存储本机指针的“正确”方法是什么? 如果碰巧知道本机指针的大小为<= 32位,则可以将指针视为Java ;如果碰巧知道本机指针的大小为<= 64位,则可以将Java处理为指针。但是,有没有更好或更干净的方法呢? 编辑 :返回从JNI功能的原生指针是什么我 也不 想做。我宁愿返回代表本地资源的Java对象。但是,我返回的Java对象可能必须具有包含指针的字段,这使我回到了

  • 我使用apache ignite缓存作为数据存储。想知道是否有方法从客户端对大型数据集合进行分页。我不需要或希望数百万的记录从服务器转移到我的网络/移动客户端。 这是一个有效的方法吗? 我看过使用游标,但API仅限于迭代器...

  • 我试图比较两个对象,看看它们是否相同,使用hamcrest for flex-Unit,但是当对象有子对象时,它只是抛出一个错误: 我希望它做一个资产(…,hasProperties(…);在子对象上。 有没有办法得到,或者我应该创建一个自定义匹配器? 编辑 我要测试的对象结构的一个示例: 由于expected和objectUnderTest具有相同的结构,测试应该通过,但返回错误: 另外,如果有

  • 问题内容: 我正在与我的CompSci教授交谈,他建议将所有String 方法编写为: 而不是: 这两行都可以编译,但是我想知道第一种方法的好处是什么?我一直都是后一种方式。错了吗 什么是普通/常规? 问题答案: 第一种方法确保执行比较时不会收到 NullPointerException 。当您尝试在不存在的对象上调用方法时,抛出(发生)此异常。 以下是一些相关的切线:仔细阅读风险自负 不过要注意