2016-05-22 12 views
1

Spring BootとJPAでRESTサービスを作成しています。私は複合キーを持つテーブルに1対多のマッピングを持っています。親テーブル「Order」に2つの複合キー(注文ID、販売日)があり、「Order Detail」に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

関連する問題