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

Java 使用hibernate一对多和多对一映射REST web服务时的JSON无限字符串,java,json,hibernate,web-services,rest,Java,Json,Hibernate,Web Services,Rest,当使用Hibernate一对多和多对一映射并使用JSON将数据从RESTWeb服务返回到swing客户机时,我面临一些奇怪的问题 当我的web服务返回salesOrder对象时。我已检查它是否包含orderlines对象集。但是,如果我打开一个orderLine对象,它又是sales order对象 当客户端返回无限的json字符串时,这种链接导致了问题 就像下面 [ { "salesOrderNumber":"1", "customerCode":"1", "totalPrice":50.0,

当使用Hibernate一对多和多对一映射并使用JSON将数据从RESTWeb服务返回到swing客户机时,我面临一些奇怪的问题

当我的web服务返回salesOrder对象时。我已检查它是否包含orderlines对象集。但是,如果我打开一个orderLine对象,它又是sales order对象

当客户端返回无限的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;
}

}
@实体
@表(name=“salesorder”)
//@JsonIgnoreProperties({“HibernateLazInitializer”,“handler”})
公共类SalesOrder实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@列(name=“SalesOrderNumber”,unique=true,nullable=false)
私有字符串salesOrderNumber;
@列(name=“CustomerCode”)
私有字符串自定义代码;
@列(name=“TotalPrice”)
私人双总价;
@杰索尼奥雷
@OneToMany(fetch=FetchType.EAGER,mappedBy=“salesOrder”,cascade=CascadeType.ALL)
private Set orderLines=new HashSet();
公共集合getOrderLines(){
退货订单行;
}
公共void setOrderLines(Set orderLines){
this.orderLines=订单行;
}
公共字符串getSalesOrderNumber(){
返回salesOrderNumber;
}
public void setSalesOrderNumber(字符串salesOrderNumber){
this.salesOrderNumber=salesOrderNumber;
}
公共字符串getCustomerCode(){
返回客户代码;
}
公共无效setCustomerCode(字符串customerCode){
this.customerCode=客户代码;
}
公共双getTotalPrice(){
返回总价;
}
公共无效设置总价(双倍总价){
this.totalPrice=totalPrice;
}
}
@实体
@表(name=“订单行”)
//@JsonIgnoreProperties({“HibernateLazInitializer”,“handler”})
公共类OrderLines实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@列(name=“SalesOrderNumber”,unique=true,nullable=false)
私有字符串salesOrderNumber;
@身份证
@列(name=“ProductCode”)
私有字符串代码;
@列(名称=“数量”)
私人整数数量;
@杰索尼奥雷
@manytone(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name=“SalesOrderNumber”)
私人销售订单;
public SalesOrder getSalesOrder(){
退回销售订单;
}
公共作废setSalesOrder(SalesOrder SalesOrder){
this.salesOrder=salesOrder;
}
公共字符串getSalesOrderNumber(){
返回salesOrderNumber;
}
public void setSalesOrderNumber(字符串salesOrderNumber){
this.salesOrderNumber=salesOrderNumber;
}
公共字符串getProductCode(){
返回产品代码;
}
public void setProductCode(字符串productCode){
this.productCode=productCode;
}
公共整数getQuantity(){
退货数量;
}
公共无效设置数量(整数数量){
这个。数量=数量;
}
}

将实体作为json发送确实是个坏主意,因为它会将您的客户端与系统的内部表示相耦合。。。坏的黑客来自于此。如果你真的想不顾一切地做这件事,并在以后遭受痛苦(或者让你未来的同事遭受痛苦并诅咒你),请继续阅读

它不起作用的原因是Hibernate从数据库中获取的对象创建代理,并且注释丢失。有一个Jackson扩展可以解决这个问题,但请不要这样做(除非你的应用程序很琐碎而且永远不会改变)

将你的实体作为json发送是一个非常糟糕的主意。阅读这里的更多内容:-答案是hibernate正在重写类,并且可能会丢失
@JsonIgnore
注释。