簡體   English   中英

在 Hibernate/JPA 中保存一個帶有孩子的對象 - @OneToMany

[英]save an object with childs in 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM