在Hibernate/JPA-@OneToMany中保存带有子对象的对象



在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应该先保存父对象,然后再保存子对象。

  • 我使用了PERSIST级联,但它仍然不起作用

请帮帮我。

我相信您的JPA Annotation是正确的,这可能是因为您的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

最新更新