当使用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;
}
}
答案 0 :(得分:0)
将您的实体作为json发送是一个真的糟糕的主意,因为它会将您的客户端耦合到您系统的内部表示中......并且糟糕的黑客来自此。如果你确实想要这样做并且以后遭受痛苦(或者让你的未来同事受苦并诅咒你),继续阅读。
它不起作用的原因是因为Hibernate从它从DB获取的对象创建代理,并且注释丢失。有一个杰克逊扩展将负责这个jackson-datatype-hibernate,但请不要这样做(除非你的应用程序是微不足道的,永远不会改变)