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 в базе нет, получаем ошибку

введите сюда описание изображения

Идей пока нет. Подскажите пожалуйста в какую сторону смотреть


Ответы (0 шт):