hibernate jpa many-to-many перебивается ссылка в ключе после сохранения
oracle hibernate 6.2.4 spring boot 3.2.1
Имеем две таблицы с данными
@Entity
@Table(name = "TK_DOGOVOR")
public class NsiDogovorNod {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TK_DOGOVOR_SEQ")
@SequenceGenerator(sequenceName = "TK_DOGOVOR_HID", allocationSize = 1, name = "TK_DOGOVOR_SEQ")
private Long hid;
@Column(name = "DOG_ID")
private Long dogId;
// другие колонки
@OneToMany(fetch = FetchType.EAGER, mappedBy = "dogovorNod", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<NsiDogovorCurrency> nsiDogovorCurrencies = new LinkedHashSet<>(0);
public void addCur(NsiCurrency cur) {
NsiDogovorCurrency nsiDogovorCurrency = new NsiDogovorCurrency(this, cur);
nsiDogovorCurrency.setNsiDogovorCurrencyId(new NsiDogovorCurrencyId(this.getDogId(), cur.getCurId()));
nsiDogovorCurrencies.add(nsiDogovorCurrency);
}
// getter and setters
}
@Entity
@Table(name = "nsi_currency")
public class NsiCurrency {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "NSI_CURRENCY_SEQ")
@SequenceGenerator(sequenceName = "NSI_CURRENCY_HID", allocationSize = 1, name = "NSI_CURRENCY_SEQ")
private Long hid;
@Column(name = "CUR_ID")
private Long curId;
// другие колонки
public NsiCurrency() {
}
public NsiCurrency(Long curId) {
this.curId = curId;
}
// getters and setters
}
таблицы связаны по составному ключу DOG_ID - CUR_ID
@Embeddable
public class NsiDogovorCurrencyId implements Serializable {
@Column(name = "DOG_ID")
private Long dogId;
@Column(name = "CUR_ID")
private Long curId;
public NsiDogovorCurrencyId() {
}
public NsiDogovorCurrencyId(Long dogId, Long curId) {
this.dogId = dogId;
this.curId = curId;
}
// getters and setters
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
NsiDogovorCurrencyId that = (NsiDogovorCurrencyId) o;
return Objects.equals(dogId, that.dogId) && Objects.equals(curId, that.curId);
}
@Override
public int hashCode() {
return Objects.hash(dogId, curId);
}
}
@Entity
@Table(name = "TK_DOGOVOR_CURRENCY")
public class NsiDogovorCurrency implements Serializable {
@EmbeddedId
private NsiDogovorCurrencyId nsiDogovorCurrencyId;
// другие колонки
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name="DOG_ID", referencedColumnName = "DOG_ID")
@MapsId("dogId")
private NsiDogovorNod dogovorNod;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="CUR_ID", referencedColumnName = "CUR_ID")
@MapsId("curId")
private NsiCurrency nsiCurrency;
public NsiDogovorCurrency() {
}
public NsiDogovorCurrency(NsiDogovorCurrencyId nsiDogovorCurrencyId) {
this.nsiDogovorCurrencyId = nsiDogovorCurrencyId;
}
public NsiDogovorCurrency(NsiDogovorNod dogovorNod, NsiCurrency nsiCurrency) {
this.dogovorNod = dogovorNod;
this.nsiCurrency = nsiCurrency;
}
public void removeCur() {
this.setDogovorNod(null);
this.setNsiCurrency(null);
}
// getters and setters
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
NsiDogovorCurrency that = (NsiDogovorCurrency) o;
return Objects.equals(nsiDogovorCurrencyId, that.nsiDogovorCurrencyId) && Objects.equals(locked, that.locked) && Objects.equals(unLock, that.unLock) && Objects.equals(dogovorNod, that.dogovorNod) && Objects.equals(nsiCurrency, that.nsiCurrency);
}
@Override
public int hashCode() {
return Objects.hash(nsiDogovorCurrencyId, locked, unLock, dogovorNod, nsiCurrency);
}
}
Получение информации по договору работает без проблем, данные достаются и раскладываются. Проблемы возникают при сохранении
@Repository
public interface DogovorNodRepository extends JpaRepository<NsiDogovorNod, Long> {
@Query(value = "select tk_dogovor_id.nextval from dual", nativeQuery = true)
Integer getNextDogId();
}
собираем объект
- значение dog_id заполняем по запросу следующего значения счетчика пробуем сохранить
NsiDogovorNod nsiDogovorNod = new NsiDogovorNod();
if (nsiDogovorNod.getDogId() == null)
nsiDogovorNod.setDogId(dogovorNodRepository.getNextDogId().longValue());
nsiDogovorNod.addCur(currencyRepository.getByCurId(1));
dogovorNodRepository.save(nsiDogovorNod);
получаю ошибку - вторичный ключ ссылается на не существующую запись в отладке вижу следующую картину перед вызовом save все выглядит хорошо
а вот после save происходит магия - в ключ NsiDogovorCurrencyId каким то образом попадает значение hid из nsiDogovorNod - соответственно записи с dogId = 83 в базе нет, получаем ошибку
Идей пока нет. Подскажите пожалуйста в какую сторону смотреть