Java Hibernate json无限递归与自引用类
class级员工:
@Entity @Table(name = "Employee") public class Employee { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "EmployeeID") private int EmployeeID; @Column(name = "ManagerID") private Integer ManagerID; @ManyToOne(cascade={CascadeType.ALL}) @JoinColumn(name="ManagerID", insertable = false, updatable = false) @JsonBackReference private Employee manager; @OneToMany(mappedBy="manager") @JsonManagedReference private Set employees; @ManyToOne(cascade={CascadeType.ALL}) @JoinColumn(name = "DepartmentID") private Department department; @ManyToOne(cascade={CascadeType.ALL}) @JoinColumn(name = "SalaryTypeID") private SalaryType salaryType; @Column(name = "Name") private String Name; //setters and getters here, wont be posting them }
每当我创建一个员工实例时,我都会遇到这个无限的json错误:
SEVERE: Servlet.service() for servlet [SpringMVC] in context with path [/SpringMVC] threw exception [Handler processing failed; nested exception is java.lang.StackOverflowError] with root cause java.lang.StackOverflowError at java.nio.CharBuffer.(Unknown Source) at java.nio.HeapCharBuffer.(Unknown Source) at java.nio.CharBuffer.wrap(Unknown Source) at sun.nio.cs.StreamEncoder.implWrite(Unknown Source) at sun.nio.cs.StreamEncoder.write(Unknown Source) at sun.nio.cs.StreamEncoder.write(Unknown Source) at java.io.OutputStreamWriter.write(Unknown Source) at java.io.Writer.write(Unknown Source) at com.google.gson.stream.JsonWriter.string(JsonWriter.java:534) at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:402) at com.google.gson.stream.JsonWriter.value(JsonWriter.java:495)
(然后它继续)
由于我是自我引用经理,这是员工类中的员工,我该如何解决这个问题?
有很多选择取决于您的要求:
1) @JsonIgnore
可用于避免字段的序列化。
@OneToMany(mappedBy="manager") @JsonIgnore private Set employees;
2) @JsonView
可以将关系的一部分隐藏为内部视图(但如果您将使用Internal
视图编写JSON对象,则会出现):
@OneToMany(mappedBy="manager") @JsonView(Views.Internal.class) private Set employees; @ManyToOne(cascade={CascadeType.ALL}) @JoinColumn(name = "DepartmentID") @JsonView(Views.Public.class) private Department department;
3) 使用自定义序列化器,您可以自己确定构建JSON对象的规则。
4)在类上使用@JsonIdentityInfo
(表示该类型的属性应该启用了function)以及单个属性(支持不能注释类型本身的情况;或者使用不同的id生成序列)。
示例1 @JsonIdentityInfo
示例2 @JsonIdentityInfo
- 如何为AbstractRoutingDataSource安全频繁的DataSource切换?
- 在JPA查询中排序返回Child对象
- 使用SequenceGenerator的javax.persistence.EntityExistsException
- Hibernate:懒得初始化一个角色集合,没有会话或会话被关闭
- 如何从代理类中检索代理类?
- 多个Hibernate配置
- 使用Spring + Hibernate / EntityManager时遇到BeanCreationException
- 在Hibernate Criteria中将date转换为字符串
- 在Spring Data JPA存储库中使用@Primary