问题描述
在Hibernate中,我想保存一个有子对象的对象。在父对象中,我拥有Set的其他子类。父母与孩子有一个@OneToMany关系。
父母:
@Entity
public class TalentIdentitySetting {
@OneToMany(fetch = FetchType.LAZY,mappedBy = "setting",cascade = CascadeType.ALL,orphanRemoval = true)
private Set<TalentIdentitySettingPower> settingPowers;
@OneToMany(fetch = FetchType.LAZY,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;
}
如何在一次交易中一起保存父母和孩子。 这是我的问题;当孩子想被保存时,父母还没有被保存,并说找不到父母钥匙。 实际上,休眠应该先保存父母,然后再保存孩子。
- 我使用了PERSIST级联,但是仍然没有用。
请帮助我。
解决方法
我相信您的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