在 Hibernate/JPA 中保存一个带有子对象的对象 - @OneToMany
Posted
技术标签:
【中文标题】在 Hibernate/JPA 中保存一个带有子对象的对象 - @OneToMany【英文标题】:save an object with childs in 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 级联,但仍然无法正常工作。请帮帮我。
【问题讨论】:
你是如何设置和保存它的?请分享一些代码? 【参考方案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 处理对象与数据库之间的关系。以上是关于在 Hibernate/JPA 中保存一个带有子对象的对象 - @OneToMany的主要内容,如果未能解决你的问题,请参考以下文章
重复条目异常:Spring Hibernate/JPA 级联保存多对一
Spring Security JDBC 和 Hibernate JPA