假设我有以下模型结构:
@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;
}
}
目前我有group1
与AnnotationOption
s opt1
opt2
和opt3
然后我想用一个选项opt1
替换所有选项
另外我在数据库中有约束:
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在更新后删除了孤儿。
你能提出解决问题的建议吗?
在这个例子中有很多错误:
@OneToMany
collection的EAGER是almost always a bad idea。解决此问题的最佳方法是将现有的子集与传入的子集明确合并,以便:
annotation_group_name
,study_id
)的子实体将使用传入数据进行更新。有关更多详细信息,请查看High-Performance Java Persistence。
根据Hibernate documentation hibernate按以下顺序执行以保留外键约束:
为了您的特殊需要,您应该手动刷新事务以强制在数据库中删除。