我正在使用Spring Boot和JPA编写REST服务。我在一个带有组合键的表中有一对多的映射。假设父表" order“有2个组合键(order id,sales date),而"Order detail”有多个具有3个组合键(order id,sales date和item id)的订单的多个项目,那么我的请求对象应该是什么。我想知道是否可以不显式地设置连接列属性并持久化对象;就像我想发送以下POST有效负载并将其映射到Order对象一样。此映射不会设置salesDate和orderId的值,这两个键是OrderDetail的组合键。正因为如此,持久化会因为重复而失败。
{
"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文档对此上下文帮助不大。请帮我解决这个问题。
https://stackoverflow.com/questions/37376405
复制相似问题