java - Spring JPA、MySQL-无法写入内容: Infinite recursion StackOverflowError through reference chain

标签 java spring hibernate jpa

我想知道我在这里是否做错了什么,因为我已经以非递归的方式完成了加载类型。但我收到以下错误。当我尝试从访问对象访问 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/

相关文章:

java - 具有一个边框和多个功能的 Shapefile?

java - 带有 Getter/Setter 的私有(private)列表与公共(public)列表

java - 在 Hibernate 中映射 Java 8 月份枚举列表

java - Hibernate org.hibernate.LazyInitializationException : could not initialize

java - Hibernate错误分离实体传递到持久化

java - 如何使用 Maven 创建具有依赖项的可执行/可运行 JAR?

java - 如何使用行和列索引(TableCellRenderer)设置 JTable 中特定单元格的颜色

Spring WebFlux 没有流式响应

java - DynamoDB Spring Boot 数据剩余 "PersistentEntity must not be null!"

java - Spring REST API 并防止更改自动生成的属性?