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

时间:2017-08-24 11:56:25

标签: 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;
    }
}

当我尝试保存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

1 个答案:

答案 0 :(得分:0)

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

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