我们说我有以下模型结构:
@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
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.
这一次开火了:
{{1}}
实际上,假设hibernate在更新后删除了孤儿。
你能提出解决问题的建议吗?
答案 0 :(得分:5)
这个例子中有很多错误:
@OneToMany
集合的EAGER为almost always a bad idea。解决这个问题的最佳方法是将现有的子集与传入的子集明确合并,以便:
annotation_group_name
,study_id
)匹配的子实体将使用传入数据进行更新。有关详细信息,请查看High-Performance Java Persistence。
答案 1 :(得分:1)
根据Hibernate documentation hibernate按以下顺序执行以保留外键约束:
为了您的特殊需要,您应该手动刷新事务以强制在数据库中删除。