当前位置: 首页 > 面试题库 >

使用JPA Hibernate自动保存子对象

凌清夷
2023-03-14
问题内容

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

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

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

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

session.save(parent);

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

提前致谢。


问题答案:

我尝试了上面的方法,但是我收到一个数据库错误,抱怨Child表中的外键字段不能为NULL。是否可以告诉JPA自动将此外键设置为Child对象,以便它可以自动保存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);

参考文献

  • Hibernate Core参考指南
    • 1.2.6。工作双向链接


 类似资料:
  • 问题内容: 实现自动保存功能的最佳javascript库或库的插件或扩展是什么? 特定的需求是能够“保存”数据网格。考虑gmail和Google Documents的自动保存。 如果车轮已经被发明,我不想重新发明。我正在寻找神奇的autoSave()函数的现有实现。 自动保存:推送到保存到持久性存储(通常是数据库)的服务器代码。服务器代码框架不在此问题的范围内。 请注意,我不是在寻找Ajax库,而

  • 关于这个问题,我已经做了相当多的谷歌搜索,我发现的大多数线程都有2年多的历史了,所以我想知道是否有什么改变,或者是否有一个新的方法来解决与这个话题有关的问题。 您在使用IntelliJ(我使用14.0.2)时可能知道,它经常自动保存文件。对我来说,在Java或JavaScript文件中进行更改时,大约需要2秒才能保存更改。有一些选项可能会对此产生影响,例如设置>外观和行为>系统设置>同步>如果应用

  • 当我读到cascade和inverse时,有人说它们都在做完全不同的事情。级联:在级联中,在一个操作(保存、更新和删除)完成后,它决定是否需要调用其他操作(保存、更新和删除)对其他相互有关系的实体。反向:这用于决定哪一方是管理关系的关系所有者(插入或更新外键列)。 假设我保存有一些孩子的父级。所以当我一方面用inverse="true"cascade="all"设置一对多时,我希望孩子是关系的所有

  • 问题内容: 嗨,我正在尝试将EditText小部件值保存在手机/平板电脑的内部存储器中,以便应用程序关闭或活动停止时可以自动检索它们。所有这些都可以使用保存按钮来完成。(窗口小部件的值由用户输入)。 问题答案: 您应该使用共享首选项,共享首选项用于在需要访问数据时将其存储在本地应用程序中。使用此链接https://www.journaldev.com/9412/android- shared-pr

  • 保存密码/自动登入 若要使用此机能,可能需先更新系统软件。 保存密码后,会显示已输入密码的登入画面,且不需每次频繁输入密码。此外,设定自动登入后,每次启动(账户管理)或(PlayStation®Store)时,皆会自动登入PlayStation®Network。 重要 保存密码后,可能会有第三者未经许可即擅自利用网络服务或阅览情报,请多注意。 将PSP™委托修理、转让给他人或返还给销售店(仅限部分

  • 和 并将其存储在: 问题是:我真的需要手动保存每页吗?我是否可以只处理java集合,然后只保存主实体,如: 这个例子取自https://attacomsian.com/blog/spring-data-jpa-one-to-many-mapping 我想知道存储关系的正确和最好的方法,这就是为什么我在这里提问,而不仅仅是自己做实验,因为这篇文章似乎误导了很多人