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

问题描述

在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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...