2016-05-22 8 views
1

Я пишу службу 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 не очень помогает в этом контексте. Пожалуйста, помогите мне решить эту проблему.

ответ

0

Вы можете попытаться использовать аннотацию @JsonIgnore на orderId член OrderDetailId. Это должно подавить участника от выхода JSON.

@JsonIgnore 
private int orderId; 

Также есть аннотация объекта @JsonIgnoreProperties({"memberName"}). Вам не нужно отмечать каждый член «внутри» исходного кода класса.

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

Благодарим за отзыв. Я знаю, что мы можем использовать @JsonIgnore для ответа. Но я говорю о полезной нагрузке здесь. Я хочу опубликовать json, который сохраняется без переформатирования запроса к существующей структуре сущности базы данных. – Rumesh

Смежные вопросы