【问题标题】:save an object with childs in Hibernate/JPA - @OneToMany在 Hibernate/JPA 中保存一个带有子对象的对象 - @OneToMany
【发布时间】:2020-09-02 10:31:29
【问题描述】:

在 Hibernate 中,我想保存一个有子对象的对象。在父对象中,我有一组其他子类。父级与子级具有@OneToMany 关系。

父母:

@Entity
public class TalentIdentitySetting {

 @OneToMany(fetch = FetchType.LAZY, mappedBy = "setting", cascade = CascadeType.ALL, orphanRemoval = true)
 private Set<TalentIdentitySettingPower> settingPowers;

 @OneToMany(fetch = FetchType.LAZY, mappedBy = "setting", cascade = CascadeType.ALL, orphanRemoval = true)
 private Set<TalentIdentitySettingSpeciality> settingSpecialities;

}

孩子:

@Entity
public class TalentIdentitySettingPower {

 @ManyToOne(fetch = FetchType.LAZY)
 @JoinColumn(name = "IDENTITY_SETTING_ID", nullable = false)
 private TalentIdentitySetting setting;

 @ManyToOne(fetch = FetchType.LAZY)
 @JoinColumn(name = "POWER_ID", nullable = false)
 private BasePower power;

}

如何在一笔交易中同时保存父母和孩子。 这是我的问题;当孩子想要被保存时,父母还没有被保存,并说没有找到父母密钥。 其实hibernate应该先保存parent再保存child。

  • 我使用了 PERSIST 级联,但仍然无法正常工作。

请帮帮我。

【问题讨论】:

  • 你是如何设置和保存它的?请分享一些代码?

标签: java hibernate hibernate-onetomany


【解决方案1】:

我相信您的 JPA 注释是正确的,这可能是您的 TalentIdentitySettingPower.setting 在保存之前没有设置

假设你有以下代码

        TalentIdentitySetting setting = new TalentIdentitySetting();
        HashSet<TalentIdentitySettingPower> powers = new HashSet<>();
        powers.add(new TalentIdentitySettingPower());
        powers.add(new TalentIdentitySettingPower());
        powers.add(new TalentIdentitySettingPower());
        setting.setSettingPowers(powers);
        repository.save(setting);

这将失败并抱怨空值问题

如果在 TalentIdentitySettingPower 中添加构造方法

    public TalentIdentitySettingPower(TalentIdentitySetting setting) {
        this.setting = setting;
    }

        TalentIdentitySetting setting = new TalentIdentitySetting();
        HashSet<TalentIdentitySettingPower> powers = new HashSet<>();
        powers.add(new TalentIdentitySettingPower(setting));
        powers.add(new TalentIdentitySettingPower(setting));
        powers.add(new TalentIdentitySettingPower(setting));
        setting.setSettingPowers(powers);
        repository.save(setting);

这将成功地将值保存到数据库中。

根据您的示例,我创建了一个应用程序https://github.com/hepoiko/stack-63703687

【讨论】:

  • Thanks.it 工作...但休眠应该处理它... :(
  • 我不会说这应该由 Hibernate 处理。 Hibernate 处理对象与数据库之间的关系。
猜你喜欢
  • 2018-02-24
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2015-07-08
相关资源
最近更新 更多