Предотвращение рекурсивной ассоциации в спящем режиме ManyToOne - PullRequest
0 голосов
/ 09 марта 2020

Прошло некоторое время с тех пор, как мы работали с ORM на Java и в настоящее время искали вариант предотвращения рекурсивных ссылок в отношениях, подобных OneToMany. Вот тривиальный образец.

@Entity
public class InnerEntity extends BaseEntity {

    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    private OuterEntity host;

    public InnerEntity() {
    }

    public InnerEntity(String name, OuterEntity host) {
        this.name = name;
        this.host = host;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public OuterEntity getHost() {
        return host;
    }

    public void setHost(OuterEntity host) {
        this.host = host;
    }

}

@Entity
public class OuterEntity extends BaseEntity {

    private String name;

    @OneToMany(mappedBy = "host")
    private List<InnerEntity> dataset;

    public OuterEntity() {
    }

    public OuterEntity(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<InnerEntity> getDataset() {
        return dataset;
    }

    public void setDataset(List<InnerEntity> dataset) {
        this.dataset = dataset;
    }
}

public interface OuterTestRepository extends CrudRepository<OuterEntity, Long> {

    @Query("SELECT outerEntity FROM OuterEntity outerEntity LEFT JOIN outerEntity.dataset")
    Collection<OuterEntity> getAll();
}

@GetMapping("/test")
public ResponseEntity<?> validate() {
    return new ResponseEntity<>(repository.getAll(), HttpStatus.OK);
}

В результате запроса OuterEntity host снова содержит ссылку на InnerEntity, которая инициирует ссылку.

Каков общий подход к предотвращению этого?

1 Ответ

1 голос
/ 09 марта 2020

Если вы используете Джексона, вы можете использовать двунаправленное отображение Джексонов:

в OuterEntity:

@JsonManagedReference
@OneToMany(mappedBy = "host")
private List<InnerEntity> dataset = new ArrayList<>();

в InnerEntity:

@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
private OuterEntity host;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...