Spring boot Spring引导REST JPA JSON格式
我正在用SpringBoot和JPA编写REST服务。我在具有复合键的表中有一对多映射。假设父表“订单”有2个复合键(订单id、销售日期),而“订单明细”有多个订单项目和3个复合键(订单id、销售日期和项目id),那么我的请求对象应该是什么样的。我想知道是否可以不显式设置连接列属性并持久化对象;就像我想发送下面的POST负载并将其映射到Order对象一样。此映射不会为OrderDetail的复合键salesDate和orderId设置值。因此,由于重复,持久化将失败Spring boot Spring引导REST JPA JSON格式,spring-boot,jpa,spring-data-jpa,one-to-many,spring-rest,Spring Boot,Jpa,Spring Data Jpa,One To Many,Spring Rest,我正在用SpringBoot和JPA编写REST服务。我在具有复合键的表中有一对多映射。假设父表“订单”有2个复合键(订单id、销售日期),而“订单明细”有多个订单项目和3个复合键(订单id、销售日期和项目id),那么我的请求对象应该是什么样的。我想知道是否可以不显式设置连接列属性并持久化对象;就像我想发送下面的POST负载并将其映射到Order对象一样。此映射不会为OrderDetail的复合键salesDate和orderId设置值。因此,由于重复,持久化将失败 { "salesDa
{
"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;
}
}
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文档在这方面没有多大帮助。请帮助我解决此问题。您可以尝试在
OrderDetailId
的orderId
成员上使用@JsonIgnore
注释。这将禁止JSON输出中的成员
@JsonIgnore
private int orderId;
还有类注释@JsonIgnoreProperties({“memberName”})
。您不必将类源代码中的每个成员都标记为“内部”
@JsonIgnoreProperties({"orderId"})
public class OrderDetail implements Serializable {
...
谢谢你的回复。我知道我们可以使用@JsonIgnore进行响应。但我这里说的是请求有效负载。我想发布持久化的json,而不将请求重新格式化为实际的数据库实体结构。
@JsonIgnoreProperties({"orderId"})
public class OrderDetail implements Serializable {
...