在 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的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate JPA 关联关系

重复条目异常:Spring Hibernate/JPA 级联保存多对一

Spring Security JDBC 和 Hibernate JPA

hibernate/JPA 中的 @PreUpdate 和 @Prepersist(使用会话)

hibernate JPA:可选值生成

Hibernate JPA 加入继承