2015-11-01 31 views
0

我使用当Hibernate一对多和多对一映射和REST Web服务返回使用JSON到我的挥杆客户数据面临着一些奇怪的问题。JSON无限字符串使用Hibernate一对多和多对一映射REST Web服务时

当我的web服务返回salesOrder对象。我已经检查过它包含了orderlines对象集。但是,如果我打开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; 
} 

} 
+0

这是一个真正的** **好主意,把你的实体JSON。在这里阅读更多:http://stackoverflow.com/a/30519514/608820 - 答案是,hibernate重写类,可能'@ JsonIgnore'注释丢失。 – Augusto

回答

0

这是一个真正糟糕的主意,把你的实体JSON,因为它将对夫妇​​您的客户系统的内部表示...坏黑客来自这个。如果你确实想要做到这一点,并在稍后遭受损失(或让你的未来同事遭受诅咒),请继续阅读。

它之所以不起作用是因为Hibernate源于它从数据库获取对象创建代理和注释都将丢失。有一个杰克逊的扩展,会照顾这个jackson-datatype-hibernate的,但(除非你的应用程序是微不足道的,绝不会发生变化),请不要做