我正在使用Spring Boot和JPA編寫REST服務。我在具有複合鍵的表中有一對多的映射。假設如果父表「訂單」有2個組合鍵(訂單ID,銷售日期),並且「訂單明細」具有多個具有3個組合鍵(訂單ID,銷售日期和物料ID)的訂單項,我的請求對象是。我想知道是否可以不顯式設置連接列屬性並保留對象;就像我想發送以下POST有效內容並將其映射到Order對象。此映射不會爲OrderDetail的組合鍵salesDate和orderId設置值。由於這種持續失敗,由於重複。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