Я пишу службу REST с Spring Boot и JPA. У меня есть сопоставление от одного до многих в таблице с составными ключами. Предположим, если в родительской таблице «Заказ» есть 2 составных ключа (идентификатор заказа, дата продажи), а «Детали заказа» содержит несколько элементов этого заказа с 3 составными ключами (идентификатор заказа, дата продажи и идентификатор объекта), как должен мой объект запроса быть. Я хочу знать, нельзя ли явно устанавливать свойства столбца и сохранять объекты; например, я хочу отправить следующую полезную нагрузку POST и нанести ее на объект Order. Это сопоставление не будет устанавливать значения для salesDate и orderId, которые являются составными ключами OrderDetail. Из-за этого persist не удается из-за дубликатов.Spring Boot REST JPA JSON формат
{
"salesDate": "2016-02-12",
"orderId": 12,
"Description":"Sample order",
"orderDetail":[{
"itemId": 1231,
"quantity": 2
},
{
"itemId": 23342,
"quantity": 1
}]
}
Order.java:
@Entity
@Table(name = "ORDR")
@IdClass(OrderId.class)
public class Order implements Serializable {
private static final long serialVersionUID = 2496620945369260577L;
@Id
@Column(name = "SLS_DT")
private Date salesDate;
@Id
@Column(name = "ORDR_ID")
private int orderId;
@Column(name = "ORDR_DESC")
private short orderDescription;
@Column(name = "CUST_ID")
private int customerId;
@OneToMany(cascade= CascadeType.ALL, mappedBy = "order")
private List<OrderDetail> orderItems;
public Date getSalesDate() {
return salesDate;
}
public void setSalesDate(Date salesDate) {
this.salesDate = salesDate;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public short getOrderDescription() {
return orderDescription;
}
public void setOrderDescription(short orderDescription) {
this.orderDescription = orderDescription;
}
public int getCustomerId() {
return customerId;
}
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
}
OrderId.java:
public class OrderId {
private Date salesDate;
private int orderId;
public Date getSalesDate() {
return salesDate;
}
public void setSalesDate(Date salesDate) {
this.salesDate = salesDate;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
}
OrderDetail.java
@Entity
@Table(name= "ORDR_DTL")
@IdClass(OrderDetail.class)
public class OrderDetail implements Serializable{
private static final long serialVersionUID = 3603127094767197954L;
@Id
@Column(name = "SLS_DT")
private Date salesDate;
@Id
@Column(name = "ORDR_ID")
private int orderId;
@Id
@Column(name = "ITEM_ID")
private int itemId;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumns({@JoinColumn(name = "SLS_DT", referencedColumnName = "SLS_DT", insertable = false, updatable = false),
@JoinColumn(name = "ORDR_ID", referencedColumnName = "ORDR_ID", insertable = false, updatable = false)})
private Order order;
private BigDecimal quantity;
public Date getSalesDate() {
return salesDate;
}
public void setSalesDate(Date salesDate) {
this.salesDate = salesDate;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public int getItemId() {
return itemId;
}
public void setItemId(int itemId) {
this.itemId = itemId;
}
public BigDecimal getQuantity() {
return quantity;
}
public void setQuantity(BigDecimal quantity) {
this.quantity = quantity;
}
}
OrderDetailId.java:
public class OrderDetailId implements Serializable {
private static final long serialVersionUID = 2312835624801595602L;
private Date salesDate;
private int orderId;
public Date getSalesDate() {
return salesDate;
}
public void setSalesDate(Date salesDate) {
this.salesDate = salesDate;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public int getItemId() {
return itemId;
}
public void setItemId(int itemId) {
this.itemId = itemId;
}
private int itemId;
}
Если я передаю следующий JSON, он работает должным образом. Но я не хочу повторять ключи в деталях заказа и не хочу раскрывать структуру базы данных клиенту.
{
"salesDate": "2016-02-12",
"orderId": 12,
"Description": "Sample order",
"orderDetail": [{
"salesDate": "2016-02-12",
"orderId": 12,
"itemId": 1231,
"quantity": 2
}, {
"salesDate": "2016-02-12",
"orderId": 12,
"itemId": 23342,
"quantity": 1
}]
}
Я могу передать первый json и преобразовать его в объекты JPA. Но я считаю, что для этого должен быть более чистый подход. Документация JPA не очень помогает в этом контексте. Пожалуйста, помогите мне решить эту проблему.
Благодарим за отзыв. Я знаю, что мы можем использовать @JsonIgnore для ответа. Но я говорю о полезной нагрузке здесь. Я хочу опубликовать json, который сохраняется без переформатирования запроса к существующей структуре сущности базы данных. – Rumesh