我正在尝试建模一个父实体,它有一个子实体集合(childHistory),还有一个指向最后添加的子节点的指针(currentChild)
class Parent {
//unidirectional
@OneToOne(cascade = CascadeType.PERSIST, optional = false)
@JoinColumn(name = "current_child_id")
private Child currentChild;
//bidirectional
@OneToMany(mappedBy = "parent")
private List<Child> childHistory;
public Parent() {
currentChild = new Child(this);
childHistory = new ArrayList<>();
childHistory.add(currentChild);
}
public void add() {
currentChild = new Child(this);
childHistory = new ArrayList<>();
childHistory.add(currentChild);
}
}
class Child {
@ManyToOne(optional = false)
@JoinColumn(name = "parent_id")
private Parent parent;
public Child(Parrent parent) {
this.parent = parent;
}
}
当我尝试保存Parent时,我现在获得了瞬态实体的例外(并且依靠级联来保留子节点)。我无法事先保存父母,因为我在父母的监护人中初始化了一切。
警告(导致例外......):
警告:HHH000437:尝试保存一个或多个具有。的实体 与未保存的瞬态实体的非可空关联。未得救的人 在保存瞬态实体之前,必须将其保存在操作中 依赖实体。未保存的瞬态实体:
([com.Parent#<null>])
从属实体:([[com.Child#<null>]])
不可为空 协会:([com.Child.entity])
警告:HHH000437:尝试保存一个或多个具有。的实体 与未保存的瞬态实体的非可空关联。未得救的人 在保存瞬态实体之前,必须将其保存在操作中 依赖实体。未保存的瞬态实体:
([com.Child#<null>])
从属实体:([[com.Parent#<null>]])
不可为空 协会:([com.Parent.currentChild])
有没有办法对此进行正确建模,并且使用hibernate具有NOT NULL db列。
编辑:对于一个复制品,请看这个要点:https://gist.github.com/jlogar/2da2237640aa013f2cfbda33a4a5dc84
答案 0 :(得分:0)
例外是指保存瞬态实体,这意味着您正在尝试保存与非托管实体有关系的实体,因为您的父级正在级联onetoone子级,那么问题将出在childHistory上,因为这是双向的自从将孩子们级联起来之后它会产生的关系
@OneToMany(mappedBy = "parent",cascade=CascadeType.PERSIST)
private List<Child> childHistory;