【发布时间】:2018-08-22 06:51:16
【问题描述】:
这个问题有点问我想要实现什么,但没有真正的答案:Hibernate validateManyToOnehas at least one
我有两个对象(A 和 B)。 A 是父母。 B是孩子。这是一对多的关系,但是,我需要每个 A 始终至少有一个 B。B 中的所有字段都有默认值,因此如果在没有 B 的情况下创建 A,则可以将默认 B 添加到确保始终有一个 B。如果添加了一个或多个 B 对象 A,则无需创建默认 B。
这是A:
[Fields]
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "key", nullable = false)
@Fetch(value = FetchMode.SUBSELECT)
private List<B> b = new ArrayList<>();
...
@PrePersist
protected void onCreate() {
// Default values configured here, for example
if (fieldA1 == null) {
fieldA1 = "A DEFAULT";
}
...
}
这是乙:
[Fields]
@PrePersist
protected void onCreate() {
// Default values configured here, for example
if (fieldB1 == null) {
fieldB1 = "B DEFAULT";
}
...
}
我以为我可以在A中使用相同的@PrePersist注解,检查是否有任何B对象,如果没有则创建一个默认B:
@PrePersist
protected void onCreate() {
// Deafult values configured here
...
if (b.size() == 0) {
b.add(new B());
}
}
这行不通。如果我创建一个没有 B 对象的 A,那么在日志中我只会得到:
在删除处理中处理瞬态实体
并且 A 是在没有 B 的情况下创建的。如果我尝试创建一个带有至少一个 B 的 A,那么我会收到以下错误:
引起:org.hibernate.TransientObjectException:对象引用 未保存的瞬态实例 - 之前保存瞬态实例 冲洗
有什么想法可以让我完成这项工作吗?
【问题讨论】:
-
顺便说一句,我想赞扬你的问题。很少看到新的贡献者在他们的问题上付出了如此多的努力。
-
@Thomas,感谢您的客气话。这可能是我的第一个问题,但我已经在这里潜伏了很多年 :) 我见过好问题和坏问题,这有助于了解如何最好地构建它。