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