Проблема с сопоставлением сущностей с составным ключом. Весенняя спячка - PullRequest
0 голосов
/ 06 августа 2020

Доброе утро, ребята, я искал вопрос, связанный с этим, но я действительно не смог его найти.

Я разрабатываю Rest API для системы финансовых транзакций, где у меня есть 3 объекта, все из них с PK, состоящим из идентификатора таблицы и идентификатора пользователя:

Финансы: Финансовые транзакции (ключи: financialId, userId) Платеж: Paymenst (ключи: paymentId, userId) Категория: Категории транзакций (ключи: categoryId, userId)

CRUD оплаты и категории уже работают нормально, но в Финансах мне удалось заставить работать только Gets, он правильно ищет все поля, однако во вставке Hibernate игнорирует атрибуты, связывающие финансы с платежом и Категория, и я не могу найти причину.

Финансы организации

@Data
@Entity(name = "financeiros")
public class Finance{

    @EmbeddedId
    private FinanceId financeId;

    @Column(name = "dtcompra")
    @Temporal(TemporalType.DATE)
    private Date buyDate;

    @Column(name = "dtbaixa")
    @Temporal(TemporalType.TIMESTAMP)
    private Date payDate;

    @Column(name = "dtvencimento")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dueDate;

    @Column(name = "recdesp")
    private Integer recdesp;

    @Column(name = "valor")
    private Float value;

    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "codnat", referencedColumnName = "codnat",insertable = false, updatable = false),
            @JoinColumn(name = "user_id", referencedColumnName = "user_id",insertable = false, updatable = false)
    })
    private Category category;

    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "codpgmt", referencedColumnName = "codpgmt", insertable = false, updatable = false),
            @JoinColumn(name = "user_id", referencedColumnName = "user_id", insertable = false, updatable = false)
    })
    private Payment payment;

    @Column(name = "observacao")
    private String note;

    @Column(name = "dtlancamento")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dateIncluded;

    @Column(name = "dtmodificacao")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dateModified;

}

Класс ключевого financialId

@Data
@Embeddable
public class FinanceId implements Serializable {

    @Column(name = "codfin")
    private Integer financeId;

    @ManyToOne
    @JoinColumn(name = "user_id", referencedColumnName = "user_id")
    private UserIdFilter userIdFilter;

    public FinanceId() {
    }

    public FinanceId(Integer financeId, Integer userId) {
        this.financeId = financeId;
        this.userIdFilter = new UserIdFilter(userId);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        FinanceId financeId1 = (FinanceId) o;
        return Objects.equals(financeId, financeId1.financeId) &&
                Objects.equals(userIdFilter, financeId1.userIdFilter);
    }

    @Override
    public int hashCode() {
        return Objects.hash(financeId, userIdFilter);
    }

}

Когда я собираюсь отправить объект FINANCE для сохранения в банке, я создаю объект следующим образом:

public Finance insertNewFinance(FinanceDto financeDto, Integer userId) {
Finance finance = new Finance();
finance.setBuyDate(financeDto.getBuyDate());
finance.setDueDate(financeDto.getDueDate());
finance.setCategory(categoryService.getByCategoryId(financeDto.getCategoryId(), userId));
finance.setPayment(paymentService.getByPaymentId(financeDto.getPaymentId(), userId));
finance.setDateIncluded(new Date());
finance.setDateModified(new Date());
finance.setNote(financeDto.getNote());
finance.setRecdesp(financeDto.getRecdesp());
finance.setValue(financeDto.getValue());

FinanceId financeId = new FinanceId(financeRepository.findNextId(userId), userId);
finance.setFinanceId(financeId);

return financeRepository.save(finance);
}

Вот проблема в запущенном SQL журнале появляется следующая вставка:

Hibernate: insert into `financeiros` (`dtcompra`, `dtlancamento`, `dtmodificacao`, `dtvencimento`, `observacao`, `dtbaixa`, `recdesp`, `valor`, `codfin`, `user_id`) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Поля ссылок не отображаются (codpgmt, codnat) во вставке

Я уже пытался удалить атрибут «insertable = false», но пружина вернулась me: user_id (должен быть сопоставлен с помощью insert = "false" update = "false")

Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...