如何防止我的多对多关系无限递归或 JSON 写入失败?

How to prevent my manytomany relationship from infinte recursion or JSON writing failure?

我正在尝试使双向多对多关系与 Hibernate 和 Maven 一起工作,但它总是抛出 org.hibernate.LazyInitializationException:无法初始化代理 - 无会话或 Whosebugerror。我已经尝试过@JSONIdentityInfo,这导致 Maven 自动添加一个“PK”变量,这主要扰乱了我的前端,@JSONManagedReference 和@JSONBackreference,这导致接收反向引用的实体被完全忽略,@JSONIGnore,与反向引用相同的问题、@JsonView,它似乎没有任何变化,而@JsonSerialize 带有自定义序列化程序,在实现时也会导致前端出现问题。我也尝试将自己的查询直接写入存储库,但它导致了同样的问题。我真的是在我的能力的尽头,不知道还能做什么。

节点

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonView;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import de.sadgmbh.spring.angular.backenddemo.model.AbstractAuditingEntity;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.HashSet;
import java.util.Set;

@Getter
@Setter
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)

@Entity
@Table(name = "knotenpunkte")
//@JsonSerialize(using = CustomKnotenpunktSerializer)
public class Knotenpunkt extends AbstractAuditingEntity<Long> {
    @NotNull
    @Column(length = 50, unique = true, nullable = false)
    @JsonView(Views.Public.class)
    private int knotennr;
    @NotNull
    @Column(length = 50, unique = true, nullable = false)
    @JsonView(Views.Public.class)
    private String strasse;
    @NotNull
    @JsonView(Views.Public.class)
    private boolean codierung;
    @NotNull
    @JsonView(Views.Public.class)
    private boolean bake;
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "knotenpunkt_linie",
            joinColumns = {@JoinColumn(name = "knotenpunkt_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "linie_id", referencedColumnName = "id")})
    @JsonView(Views.Internal.class)
    Set<Linie> linienSet = new HashSet<>();
}


import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonView;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import de.sadgmbh.spring.angular.backenddemo.model.AbstractAuditingEntity;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.HashSet;
import java.util.Set;

@Getter
@Setter
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
@Entity
@Table(name = "linien")
//@JsonSerialize(using = CustomLineSerializer.class)
public class Linie extends AbstractAuditingEntity<Long> {
    @NotNull
    @Column(length = 50, unique = true, nullable = false)
    @JsonView(Views.Public.class)
    private String linienNR;
    @ManyToMany( mappedBy = "linienSet")
    @JsonView(Views.Internal.class)
    private Set<Knotenpunkt> knotenpunktSet = new HashSet<>();
}

Maven 生成的接口

export interface Knotenpunkt extends AbstractAuditingEntity<number> {
    id: number;
    knotennr: number;
    strasse: string;
    codierung: boolean;
    bake: boolean;
    linienSet: Linie[];
}

export interface Linie extends AbstractAuditingEntity<number> {
    id: number;
    linienNR: string;
    knotenpunktSet: Knotenpunkt[];
}

export interface Views {
}

export interface Internal extends Public {
}

export interface Public {
}

export interface JsonSerializer<T> extends JsonFormatVisitable {
    unwrappingSerializer: boolean;
    delegatee: JsonSerializer<any>;
}

最终解决方案是将 @Transactional 添加到控制器。希望这可能对某人有所帮助。