- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有这样一个类:
@Entity
@Table(name="work")
public class Work {
@Id
@Column(name="id")
private String id;
@OneToMany(orphanRemoval=true ,mappedBy="work", cascade=CascadeType.ALL , fetch=FetchType.EAGER)
private List<PersonRole> personRoleList;
}
因为我的是一个 web 应用程序,当我更新(来自客户端)一个 personRoleList
项目并调用:
session.update(work); //`work` is in detached state
它不会更新现有的 personRoleList
项目,它实际上会添加一个新项目。
其他人也有同样的问题。引用:
using-saveorupdate-in-hibernate-creates-new-records-instead-of-updating-existi
jpa-onetomany-not-deleting-child
我尝试了所有建议的解决方案,但没有一个适合我。
但是然后我就尝试了:
session.merge(work); //replacing session.update(work)
而且它按预期工作。!!
这就是我感到困惑的地方。因为我找不到任何解释这种 OneToMany 关系情况下的行为差异(或者我可能错过了)。我阅读了一些线程以了解 update()
和 merge()
之间的区别并浏览了文档。引用:
what-are-the-differences-between-the-different-saving-methods-in-hibernate
differences-among-save-update-saveorupdate-merge-methods-in-session
但仍然不清楚造成这种差异的行为模式/逻辑/步骤是什么?
最佳答案
Merge 尝试将当前 transient 对象与当前由 session 管理的持久对象关联起来,方法是将它们“合并”为一个实体。它的预期用途是当您有一个分离的对象和一个附加的对象并希望解析它们时。
在 merge()
中,如果 session 中还没有托管实例,Hibernate 将从数据库中读取实体。在您的示例中,这将导致 Hibernate 急切地加载集合(由于 fetch=FetchType.EAGER
)。然后当您的 session 结束时,Hibernate 将检查集合中的更改(由于 cascade=CascadeType.ALL
)并将在数据库中执行适当的更新。
这不同于 update()
场景,因为在更新中,Hibernate 总是(默认情况下)假定对象是脏的并安排更新。此更新可能是导致在您的集合中创建新元素的原因 - Hibernate 在发布更新之前没有查看数据库以将集合带入 session 。
我敢打赌,您可以通过设置
获得所需的update()
行为
select-before-update="true"
在您的类映射中或通过使用 lock
方法在进行更改之前将您的对象重新附加到 session 。
来自 的第 9 章 Java Persistence with Hibernate
item 对象在传递给之前或之后是否被修改并不重要更新()。这里重要的是对 update() 的调用将分离的实例重新附加到新的 session (和持久性上下文)。 hibernate 始终将对象视为脏对象并安排 SQL 更新,该更新将在刷新期间执行。您可以在图 9.8 中看到相同的工作单元。 您可能会感到惊讶并且可能希望 Hibernate 能够知道您修改了分离项的描述(或者 Hibernate 应该知道你做了不修改任何东西)。然而,新的 Session 及其新的持久性上下文没有这个信息。分离的对象也不包含您所做的所有修改的一些内部列表。需要数据库中的 UDPATE。避免此 UDPATE 语句的一种方法是使用 select-before-update="true"配置 Item 的类映射属性。 Hibernate 然后通过执行一个判断对象是否脏SELECT 语句并将对象的当前状态与当前数据进行比较-基态。
关于java - update() 和 merge 在更新 OneToMany 集合中的项目时表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31033382/
编辑:我似乎问错了这个问题。 我正在尝试寻找一种方法来查询一个集合是否在另一个集合中可用。例如: SELECT * FROM something WHERE (1, 3) IN (1, 2, 3, 4
这两种方法似乎 produce the same results ,但我一直很难真正说服人们第二种方法有效,因为它显然并不为人所知。 // Create some data var foo = { '
我一直在学习Kotlin,并且遇到过Collections API。在Kotlin之前,我一直在学习Java,并且我知道Java中有很多不同类型的Collections API。例如,我们使用List
为什么我会得到不同的行为: Collection col2 = new ArrayList(col); 集合 col2 = new ArrayList(); col2.addAll(col) 我正在与
所以我有一个代表专辑信息的 JSON 对象。给定“function updateRecords(id, prop, value)”我希望能够更新每个条目。正确的完成代码如下。 我得到了指示,粗体部分,
我想存储一个对象集合,这些对象根据它们所代表的值进行键控。这些键可以重复。例如: [4] => Bob [5] => Mary [5] => Sue [9] => Steve [10] =>
在检查 ArrayList API 时,我注意到一些看起来很奇怪的东西。 确实,这里是 ArrayList 构造函数实现,其中 Collection 作为参数传递: public ArrayList(
我正在为 API 编写一个 swagger 定义文件。 API 是用于 GET 请求的 /path/to/my/api: get: summary: My Custom API d
我知道scala.collection包中有两个非常有用的对象,可以帮助我们实现这个目标: JavaConverters(如果我想明确说明并准确说明我要转换的内容) JavaConversions(如
我已经阅读了无数其他帖子,但似乎无法弄清楚发生了什么,所以是时候寻求帮助了。 我正在尝试将包含集合的域实体映射到也包含集合的 dtos。 这是一个原始示例; (我提前为代码墙道歉,我尽量保持简短):
我正在创建一个具有 ArrayList 的类,因此当我调用构造函数时,它会初始化该数组: public class ElementsList { private ArrayList list;
我正在阅读事件指南和指南的开头,它说: You can also add an event listener to any element in the this.$ collection using
我是 Python 新手,想知道如何使用键在字典中存储不同数据类型的列表 例如 - {[Key1,int1,int1,String1] , [Key2,int2,int2,String2], [Key
int[] mylist = { 2, 4, 5 }; IEnumerable list1 = mylist; list1.ToList().Add(1); // why 1 does not get
我在 UI 表单中的每一行之后将以下内容添加到 HashMap 集合中 声明 Map> map = new HashMap>(); List valSetOne = new ArrayList();
我正在开发我的第一个 Java 项目,我有一个问题。问题应该很简单(虽然代码不是那么短,但没有理由被吓倒:))。我创建了一个基本的角色扮演游戏,并且有一个定义每个角色的抽象类“Character”。在
我正在开发一款应用程序,可以为用户收集推文、Facebook 状态和 Facebook 照片。目前,用户确切地设定了他们希望这种收获发生的时间和时间,并且蜘蛛会在此期间拉取数据。 when 和 to
有谁知道在 C# 中是否有与 Java 的 Set 集合等效的好方法?我知道您可以通过填充但忽略值来使用 Dictionary 或 HashTable 在某种程度上模仿集合,但这不是一种非常优雅的方式
EXISTS 该函数返回 集合中第一个元素的索引,如果集合为空,返回NULLNULLNULL Collecti
RDF集合是通过属性 rdf:parseType="Collection" 来描述仅包含指定成员的组 rdf:parseType="Collection" 属
我是一名优秀的程序员,十分优秀!