gpt4 book ai didi

java - 如何强制 Hibernate 在更新前删除孤儿

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:39:18 24 4
gpt4 key购买 nike

假设我有以下模型结构:

@Entity
@Table(....)
public class AnnotationGroup{
...
private List<AnnotationOption> options;


@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JoinColumn(name = "annotation_group_id", nullable = false)
public List<AnnotationOption> getOptions() {
return options;
}
}

@Entity
@Table(...)
public class AnnotationOption {

private Long id;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Override
public Long getId() {
return id;
}
}

目前我有 group1AnnotationOptions opt1 opt2opt3

然后我想用一个选项替换所有选项 opt1

enter image description here

此外,我在数据库中有约束:

    CONSTRAINT "UQ_ANNOTATION_OPTION_name_annotation_group_id" UNIQUE (annotation_option_name, annotation_group_id)

这一个会触发:

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "UQ_ANNOTATION_OPTION_name_annotation_group_id"
Detail: Key (name, annotation_group_id)=(opt1, 3) already exists.

实际上 hibernate 会在更新后删除孤儿。

你能提出一些解决问题的建议吗?

最佳答案

这个例子中错误的地方太多了:

  1. @OneToMany 集合上的 EAGER 获取是 almost always a bad idea .
  2. 单向集合也不好,使用 bidirectional one .
  3. 如果您遇到此异常,很可能您清除了所有元素并重新添加了您想要保留的元素。

修复它的最佳方法是明确地将现有的子集与传入的子集合并,以便:

  1. 正在将新的子实体添加到集合中。
  2. 删除不再需要的子实体。
  3. 与业务键(annotation_group_namestudy_id)匹配的子实体将使用传入数据进行更新。

关于java - 如何强制 Hibernate 在更新前删除孤儿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46214322/

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