Доброе утро, ребята, я искал вопрос, связанный с этим, но я действительно не смог его найти.
Я разрабатываю 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")
Что я делаю не так?