сохранение объекта с дочерними элементами в режиме гибернации/JPA — @OneToMany

#java #hibernate #hibernate-onetomany

#java #переход в режим гибернации #переход в режим гибернации -onetomany

Вопрос:

В режиме гибернации я хочу сохранить объект, у которого есть дочерний элемент.В родительском объекте у меня есть набор других классов, которые являются дочерними. У родителя есть связь @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;

}
  

как я могу сохранить родительский и дочерний элементы вместе в одной транзакции.
Это моя проблема; Когда дочерний элемент хочет быть сохраненным, родительский элемент еще не сохранен, и говорят, что родительский ключ не найден.
Фактически, режим гибернации должен сначала сохранять родительский объект, а затем дочерний.

  • Я использовал каскад СОХРАНЕНИЯ, но он все равно не работал.

пожалуйста, помогите мне.

Комментарии:

1. Как вы его настраиваете и сохраняете? пожалуйста, поделитесь каким-нибудь кодом?

Ответ №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

Комментарии:

1. Спасибо. это работает … но спящий режим должен справиться с этим … 🙁

2. Я бы не сказал, что это должно обрабатываться в режиме гибернации. Режим гибернации обрабатывает связь между объектом и базой данных.