映射到子表两次 - @OneToMany 和 @ManyToOne

jl.*_*jl. 5 java hibernate jpa

我正在尝试建模一个父实体,该实体具有子实体的集合(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;
    }
}
Run Code Online (Sandbox Code Playgroud)

目前,当我尝试保存父级(并依靠级联来持久化子级)时,我遇到了瞬态实体的异常。我无法事先保存父级,因为我初始化了父级构造函数中的所有内容。

警告(导致异常......):

警告:HHH000437:尝试保存与未保存的瞬态实体具有不可为空关联的一个或多个实体。在保存这些依赖实体之前,必须在操作中保存未保存的瞬态实体。未保存的临时实体:([com.Parent#<null>]) 相关实体:([[com.Child#<null>]])不可为 null 的关联:([com.Child.entity])


警告:HHH000437:尝试保存与未保存的瞬态实体具有不可为空关联的一个或多个实体。在保存这些依赖实体之前,必须在操作中保存未保存的瞬态实体。未保存的临时实体:([com.Child#<null>]) 相关实体:([[com.Parent#<null>]])不可为 null 的关联:([com.Parent.currentChild])

有没有一种方法可以正确地对此进行建模,并且在 hibernate 中具有 NOT NULL 数据库列。

编辑:有关重现,请参阅此要点:https://gist.github.com/jlogar/2da2237640aa013f2cfbda33a4a5dc84

Ame*_*bsa 0

例外是指保存瞬态实体,这意味着您正在尝试保存与非托管实体有关系的实体,因为您的父级正在级联 onetoone 子级,那么问题将出在 childHistory 上,因为这是一个双向关系,它会让孩子们也能级联起来

@OneToMany(mappedBy = "parent",cascade=CascadeType.PERSIST)
private List<Child> childHistory;
Run Code Online (Sandbox Code Playgroud)