【问题标题】:JSON Infinite string when using hibernate one to many and many to one mapping REST web service使用休眠一对多和多对一映射REST Web服务时的JSON无限字符串
【发布时间】:2015-11-01 16:31:03
【问题描述】:

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

当我的网络服务返回 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;
}

}

【问题讨论】:

  • 将实体作为 json 发送是一个真的坏主意。在此处阅读更多信息:stackoverflow.com/a/30519514/608820 - 答案是休眠正在重写类并且可能@JsonIgnore 注释丢失了。

标签: java json hibernate web-services rest


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-02-04
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    相关资源
    最近更新 更多