gpt4 book ai didi

Hibernate EntityManager.merge() 导致创建一个新实体而不是更新现有实体

转载 作者:行者123 更新时间:2023-12-01 01:30:36 24 4
gpt4 key购买 nike

我有以下(部分)层次结构:

@MappedSuperclass
public abstract class PersistentEntity {
@Id
@GeneratedValue(generator="system-uuid")
@Type(type = "pg-uuid")
public UUID getId() {
return id;
}
}



@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING)
public abstract class AbstractCredential extends PersistentEntity {
//content
}



@Entity
@DiscriminatorValue("Standard")
@PrimaryKeyJoinColumn(name = "ID")
public class StandardCredential extends AbstractCredential {
//hashcode and quals here, by full data
}


AbstractCredential 是一个实体而不是 @MappedSuperclass,因此我可以通过 id 从中选择并获取相关的“具体”类。我的问题是,如果我使用现有实例的 id 创建一个新的(分离的)实例,然后将该分离的实例传递给合并,hibernate 会创建一个新实体(意味着它会生成一个新的 id,并覆盖我的 id 字段)新创建的实例)。
据我所知,hibernate 应该用我分离的实例中的值覆盖现有实例中的所有字段。

我究竟做错了什么 ?

最佳答案

可能是错误的,但我认为 detached 和 new 是实体生命周期中的两种不同状态。已在 session 中从数据库加载分离的实体,但 session 已关闭。但是,在这种情况下,Hibernate 应该知道该实体已经存在于数据库中,并在稍后合并实体时相应地更新值。即使 @Id 值相同,使用关键字 new 创建的实体也不会发生同样的情况。

This图表清楚地表明,处于新/ transient 状态的实体与分离(JPA)不同。 Here实体状态的 Hibernate (3.5) 手动输入。我还查看了“Java Persistence with JPA”和“Spring persistence with Hibernate”书籍,它们都以类似的方式解释了实体状态和转换(分离的实体必须持久化到数据库/从数据库中获取,然后从持久化上下文/ session 中分离出来)变得分离)。不幸的是,我找不到任何提及在您通过 new 创建新对象并手动为其分配 id 的情况下合并应该如何运作,这让我相信不应该以这种方式使用合并。不过,可能是错误的。

关于Hibernate EntityManager.merge() 导致创建一个新实体而不是更新现有实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5056525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com