2016-05-22 124 views
1

我正在使用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文檔對此沒有多大幫助。請幫我解決這個問題。

回答

0

您可以嘗試在OrderDetailIdorderId成員上使用@JsonIgnore註釋。這應該從JSON輸出壓制成員。

@JsonIgnore 
private int orderId; 

此外還有班級註釋@JsonIgnoreProperties({"memberName"})。您不必在類源代碼的「內部」標記每個成員。

@JsonIgnoreProperties({"orderId"}) 
public class OrderDetail implements Serializable { 
    ... 
+0

感謝您的回覆。我知道我們可以使用@JsonIgnore作爲迴應。但我在這裏討論請求負載。我想發佈持久化的json,而不需要將請求重新格式化爲實際的數據庫實體結構。 – Rumesh