使用 JPA 休眠自动保存子对象

2022-08-31 12:00:07

我在父表和子表之间有一对多关系。在父对象中,我有一个

List<Child> setChildren(List<Child> childs)

我在子表中还有一个外键。此外键是引用数据库中的父行的 ID。因此,在我的数据库配置中,此外键不能为 NULL。此外,此外键也是父表中的主键。

所以我的问题是,如何通过执行如下操作来自动保存子对象:

session.save(parent);

我尝试了上述方法,但收到数据库错误,抱怨子表中的外键字段不能为 NULL。有没有办法告诉 JPA 自动将此外键设置为 Child 对象,以便它可以自动保存子对象?

提前致谢。


答案 1

我尝试了上述方法,但收到数据库错误,抱怨子表中的外键字段不能为 NULL。有没有办法告诉 JPA 自动将此外键设置为 Child 对象,以便它可以自动保存子对象?

好吧,这里有两件事。

首先,您需要级联保存操作(但我的理解是,您正在执行此操作,否则在“子”表中插入期间不会遇到 FK 约束冲突)

其次,你可能有一个双向关联,我认为你没有正确设置“链接的两端”。你应该做这样的事情:

Parent parent = new Parent();
...
Child c1 = new Child();
...
c1.setParent(parent);

List<Child> children = new ArrayList<Child>();
children.add(c1);
parent.setChildren(children);

session.save(parent);

一种常见的模式是使用链接管理方法:

@Entity
public class Parent {
    @Id private Long id;

    @OneToMany(mappedBy="parent")
    private List<Child> children = new ArrayList<Child>();

    ...

    protected void setChildren(List<Child> children) {
        this.children = children;
    }

    public void addToChildren(Child child) {
        child.setParent(this);
        this.children.add(child);
    }
}

代码变为:

Parent parent = new Parent();
...
Child c1 = new Child();
...

parent.addToChildren(c1);

session.save(parent);
引用

答案 2

我相信您需要通过xml/annotation在映射中设置级联选项。请参阅此处的休眠参考示例

如果您使用的是注释,则需要执行如下操作,

@OneToMany(cascade = CascadeType.PERSIST) // Other options are CascadeType.ALL, CascadeType.UPDATE etc..

推荐