我想知道我在这里是否做错了什么,因为我已经以非递归的方式完成了加载类型。但我收到以下错误。当我尝试从访问对象访问 getServerRequest() 方法时。
WARN 6511 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Infinite recursion (StackOverflowError) (through reference chain: com.biscoind.domain.ServerRequest["visits"]->org.hibernate.collection.internal.PersistentBag[0]->com.biscoind.domain.Visit["request"]->com.biscoind.domain.ServerRequest["visits"]->org.hibernate.collection.internal.PersistentBag[0]->com.biscoind.domain.Visit["request"]->com.biscoind.domain.ServerRequest["visits"]->org.hibernate.collection.internal.PersistentBag[0]->com.biscoind.domain.Visit["request"]->com.biscoind.domain.ServerRequest["visits"]->org.hibernate.collection.internal.PersistentBag[0]->com.biscoind.domain.Visit["request"]->com.biscoind.domain.ServerRequest["visits"]->org.hibernate.collection.internal.PersistentBag[0]->com.biscoind.domain.Visit["request"]->com.biscoind.domain.ServerRequest["visits"]->org.hibernate.collection.internal.PersistentBag[0]->com.biscoind.domain.Visit["request"]->com.biscoind.domain.ServerRequest["visits"]->org.hibernate.collection.internal.PersistentBag[0]->com.biscoind.domain.Visit["request"]->com.biscoind.domain.ServerRequest["visits"]->org.hibernate.collection.internal.PersistentBag[0]->com.biscoind.domain.Visit["request"]->com.biscoind.domain.ServerRequest["visits"]->org.hibernate.collection.internal.PersistentBag[0]->
我有以下映射类,
@Entity
@Table(name = "server_request")
public class ServerRequest {
private Long id;
private Date createdDate;
private Date lastUpdatedDate;
private List<Visit> visits = new ArrayList<Visit>();
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "server_request_id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "request", cascade = CascadeType.ALL)
public List<Visit> getVisits() {
return visits;
}
public void setVisits(List<Visit> visits) {
this.visits = visits;
}
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
public Date getLastUpdatedDate() {
return lastUpdatedDate;
}
public void setLastUpdatedDate(Date lastUpdatedDate) {
this.lastUpdatedDate = lastUpdatedDate;
}
}
并且,
@Entity
@Table(name = "user_visit")
public class Visit implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private ServerRequest request;
private String status;
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_visit_id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "server_request_id", referencedColumnName = "server_request_id", nullable = false)
public ServerRequest getRequest() {
return request;
}
public void setRequest(ServerRequest request) {
this.request = request;
}
}
最佳答案
如果您使用 Jackson 并且您的转换器尝试写入的是 JSON(堆栈没有说明这一点),请输入 @JsonIdentityInfo
您的getRequest()
上的注释方法。
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="id", scope=ServerRequest.class)
@ManyToOne(fetch = FetchType.EAAGER)
@JoinColumn(name = "server_request_id", referencedColumnName = "server_request_id", nullable = false)
public ServerRequest getRequest() {
return request;
}
这是 Jackson 在序列化/反序列化期间解决对象图中的循环依赖关系的方式。
一些提示:
- 您不必声明
FetchType.LAZY
。这是默认完成的。 - 在您的 ManyToOne 上,从
FetchType.EAAGER
更改至FetchType.EAGER
关于java - Spring JPA、MySQL-无法写入内容: Infinite recursion StackOverflowError through reference chain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36042842/