首页 > 解决方案 > JPA:无限获取孩子

问题描述

我有两个实体关系的问题,它们互相调用,我想我得到了一个 inifite fetch :

@Entity
@Table(name = "domaine")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Domaine implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToMany
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "lien_domaine_specialite",
        joinColumns = @JoinColumn(name="domaine_id", referencedColumnName="ID"),
        inverseJoinColumns = @JoinColumn(name="specialite_id", referencedColumnName="ID"))
    private Set<Specialite> specialites = new HashSet<>();


@Entity
@Table(name = "specialite")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Specialite implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToMany(mappedBy = "specialites")
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Domaine> domaines = new HashSet<>();

    @ManyToOne
    private Domaine domaine;

当我添加此关系 ahd 时出现问题:

@ManyToOne
private Domaine domaine;

当我像这样加载 Domaine 实体时:

Select domaine from Domaine domaine left join fetch domaine.specialites where domaine.id = ?1

有没有办法告诉我不需要时不要Specialite加载?Domaine

标签: javajsonspringhibernatejpa

解决方案


JPA 可以轻松处理交叉引用。在当前 JPA 上下文期间加载的实体将不会再次加载。您面临的问题是什么?我想您在尝试将图形序列化为 json 时进入了无限循环。如果您不使用 @JsonManagedReferenceand @JsonBackReference(Jackson specific) ,JSON 处理库确实会进入无限循环


推荐阅读