使用hibernate一对多和多对一映射REST Web服务时的JSON无限字符串

时间:2015-11-01 16:31:03

标签: java json hibernate web-services rest

当使用Hibernate一对多和多对一映射并使用JSON将数据从休息Web服务返回到我的swing客户端时,我遇到了一些奇怪的问题。

当我的网络服务返回salesOrder对象时。我已检查它确实包含订单行对象设置。但是,如果我打开其中一个orderLine对象,它又会有销售订单对象。

这种链接导致客户端问题,即返回无限的json字符串。

如下所示......

[
{
"salesOrderNumber":"1",
"customerCode":"1",
"totalPrice":50.0,
orderLines":     
[
{
"salesOrderNumber":"1",
"productCode":"2",
"quantity":1,
"salesOrder":{"salesOrderNumber":"1","customerCode":"1","totalPrice":50.0,"orderLines":[{"salesOrderNumber":"1","productCode":"2","quantity":1,"salesOrder":{"salesOrderNumber":"1","customerCode":"1","totalPrice":50.0,"orderLines":
.............................................
...............................

我试图设置@JSONIgnore,因为我不希望将这些内容发送给客户,但是,它没有帮助。

我的两个实体如下:

@Entity
@Table(name = "salesorder")
//@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" })
public class SalesOrder implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@Column(name = "SalesOrderNumber", unique = true, nullable = false)
private String salesOrderNumber;

@Column(name = "CustomerCode")
private String customerCode;

@Column(name = "TotalPrice")
private double totalPrice;

@JsonIgnore
@OneToMany(fetch = FetchType.EAGER, mappedBy="salesOrder",cascade=CascadeType.ALL)
private Set<OrderLines> orderLines = new HashSet<OrderLines>();

public Set<OrderLines> getOrderLines() {
    return orderLines;
}
public void setOrderLines(Set<OrderLines> orderLines) {
    this.orderLines = orderLines;
}

public String getSalesOrderNumber() {
    return salesOrderNumber;
}

public void setSalesOrderNumber(String salesOrderNumber) {
    this.salesOrderNumber = salesOrderNumber;
}

public String getCustomerCode() {
    return customerCode;
}

public void setCustomerCode(String customerCode) {
    this.customerCode = customerCode;
}

public double getTotalPrice() {
    return totalPrice;
}

public void setTotalPrice(double totalPrice) {
    this.totalPrice = totalPrice;
}

}

@Entity
@Table(name = "orderlines")
//@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" })
public class OrderLines implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@Column(name = "SalesOrderNumber", unique = true, nullable = false)
private String salesOrderNumber;

@Id
@Column(name = "ProductCode")
private String productCode;

@Column(name = "Quantity")
private int quantity;

@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name="SalesOrderNumber")
private SalesOrder salesOrder;

public SalesOrder getSalesOrder() {
    return salesOrder;
}

public void setSalesOrder(SalesOrder salesOrder) {
    this.salesOrder = salesOrder;
}

public String getSalesOrderNumber() {
    return salesOrderNumber;
}

public void setSalesOrderNumber(String salesOrderNumber) {
    this.salesOrderNumber = salesOrderNumber;
}

public String getProductCode() {
    return productCode;
}

public void setProductCode(String productCode) {
    this.productCode = productCode;
}

public int getQuantity() {
    return quantity;
}

public void setQuantity(int quantity) {
    this.quantity = quantity;
}

}

1 个答案:

答案 0 :(得分:0)

将您的实体作为json发送是一个真的糟糕的主意,因为它会将您的客户端耦合到您系统的内部表示中......并且糟糕的黑客来自此。如果你确实想要这样做并且以后遭受痛苦(或者让你的未来同事受苦并诅咒你),继续阅读。

它不起作用的原因是因为Hibernate从它从DB获取的对象创建代理,并且注释丢失。有一个杰克逊扩展将负责这个jackson-datatype-hibernate,但请不要这样做(除非你的应用程序是微不足道的,永远不会改变)