首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spring Boot REST JPA JSON格式

Spring Boot REST JPA JSON格式
EN

Stack Overflow用户
提问于 2016-05-22 23:49:44
回答 1查看 1.3K关注 0票数 2

我正在使用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文档对此上下文帮助不大。请帮我解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2016-09-28 15:09:13

您可以尝试在OrderDetailIdorderId成员上使用@JsonIgnore注释。这应该会禁止来自JSON输出的成员。

@JsonIgnore
private int orderId;

还有类注释@JsonIgnoreProperties({"memberName"})。您不必将每个成员都标记为“在”类源代码内。

@JsonIgnoreProperties({"orderId"})
public class OrderDetail implements Serializable {
    ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37376405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档