Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA实体在转换为JSON时给出stackoverflow错误,但在使用POJO时没有给出_Java - Fatal编程技术网

Java JPA实体在转换为JSON时给出stackoverflow错误,但在使用POJO时没有给出

Java JPA实体在转换为JSON时给出stackoverflow错误,但在使用POJO时没有给出,java,Java,我正在使用JSON和JPA,并使用main方法对我的对象进行一些测试 每当我尝试将Java实体转换为JSON字符串时,就会出现堆栈溢出错误 String jsonString = gson.toJson(cus1) 如果在本例中使用常规POJO作为DTO,则不会出现错误。但是,当我使用实体类时,为什么会出现堆栈溢出错误呢 @Entity @Table(name = "Customers") @XmlRootElement @NamedQueries({ @NamedQuery(name

我正在使用JSON和JPA,并使用main方法对我的对象进行一些测试

每当我尝试将Java实体转换为JSON字符串时,就会出现堆栈溢出错误

String jsonString = gson.toJson(cus1)
如果在本例中使用常规POJO作为DTO,则不会出现错误。但是,当我使用实体类时,为什么会出现堆栈溢出错误呢

@Entity
@Table(name = "Customers")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Customer.findAll", query = "SELECT c FROM Customer c")
    , @NamedQuery(name = "Customer.findById", query = "SELECT c FROM Customer c WHERE c.id = :id")
    , @NamedQuery(name = "Customer.findByName", query = "SELECT c FROM Customer c WHERE c.name = :name")
    , @NamedQuery(name = "Customer.findByAge", query = "SELECT c FROM Customer c WHERE c.age = :age")})

public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private int age;
@JoinColumn(name = "city", referencedColumnName = "id")
@ManyToOne(optional = false)
private City city;
//getters, setters and constructor

该错误与城市序列化客户有关,而客户再次序列化城市,导致
StackOverflowerError

如果您没有在
Customer
实体中使用cities对象,只需在json序列化过程中忽略该字段

@XmlRootElement
public class Customer {

    @XmlTransient
    private Set<City> cities;

}
@XmlRootElement
公共类客户{
@XmlTransient
私人城市;
}

反之亦然,在
私人城市中使用
@xmltransive
字段

city有客户列表吗?是的,它有一个OneToMany的联盟,因此city hsa有一个客户,city有一个客户集合使用所有类、getter和setter更新您的问题。可能city的
toString
正在呼叫客户,并且再次呼叫city,导致StackOverflow是否需要序列化City对象中的客户?如果没有,可以使用
@xmltransive