簡體   English   中英

使用一對多休眠和多對一映射REST Web服務時的JSON無限字符串

[英]JSON Infinite string when using hibernate one to many and many to one mapping REST web service

使用Hibernate一對多和一對多映射並將JSON數據從其余Web服務返回到我的swing客戶端時,我遇到一些奇怪的問題。

當我的Web服務返回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;
}

}

將您的實體作為json發送是一個非常糟糕的主意,因為它將您的客戶與系統的內部表示耦合在一起……並且由此帶來的惡意攻擊也很嚴重。 如果您確實想這樣做而以后遭受痛苦(或讓您未來的同事之一遭受痛苦並詛咒您),請繼續閱讀。

之所以不起作用,是因為Hibernate使用從數據庫中獲取的對象創建代理,並且注釋也丟失了。 有一個Jackson擴展程序可以處理此jackson-datatype-hibernate ,但是請不要這樣做(除非您的應用程序很瑣碎並且永遠不會改變)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM