Так что в принципе у меня есть следующая потребность. Человек собирается отправить POST сущность, называемую «Отчет о расходах», через контроллер остатка.
У этой сущности есть поле Страна, которое фактически является ассоциацией с другой сущностью.
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "EXPENSE_REPORTS")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ExpenseReport extends BaseEntity {
@Column(name = "TRIP_DESCRIPTION", nullable = false)
private String tripDescription;
@Column(name = "JUSTIFICATION")
private String justification;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "COUNTRY_ID")
private Country country;
@Column(name = "TRIP_START_DATE")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate tripStartDate;
@Column(name = "TRIP_END_DATE")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate tripEndDate;
@Column(name = "TOTAL_AMOUNT")
private BigDecimal totalAmount;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="USER_ID")
private User user;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="EXPENSE_ITEM_ID")
private Set<ExpenseItem> expenses;
}
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "COUNTRIES")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Country extends BaseEntity {
@Column(name = "NAME")
@NaturalId
private String name;
}
Я хотел проверить, возможно ли, что вызывающий абонент просто отправляет естественный идентификатор страны (в данном случае, имя) и JPA, вместо того, чтобы пытаться вставить эту страну, он находит страну с тем же именем и ассоциирует его.
Таким образом, вместо отправки этого сообщения:
{
"tripDescription": "Some trip description...",
"justification": "Some justification...",
"country": {
"id": 12345
}
}
Он отправляет это:
{
"tripDescription": "Some trip description...",
"justification": "Some justification...",
"country": {
"name": "BR"
}
}
Я могу представить, как это сделать, либо в хранилище реализации, но мне было интересно, есть ли что-нибудь автоматическое c, чтобы сделать это в JPA.
Заранее спасибо.