【问题标题】:Prevent recursive association in ManyToOne hibernate防止多对一休眠中的递归关联
【发布时间】:2020-03-09 11:27:11
【问题描述】:

在 Java 上使用 ORM 已经有一段时间了,目前正在寻找一个选项来防止类似 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 的引用,它启动了引用。

预防它的常用方法是什么?

【问题讨论】:

  • 完全没问题。没有什么不好的事情发生:)
  • 好吧,我按原样返回这个结果,网页显示了无尽的 json。我没有检查内存脚印。如果这种预期行为如何以传统形式获得结果?
  • 看看stackoverflow.com/questions/16577907/…。这可能有助于并防止生成 json 时导致的无限循环。
  • 不,这是不同的事情。无论如何,感谢您的贡献!
  • 如果您使用jackson进行序列化,请考虑使用@JsonManagedReference@JsonBackReferencebaeldung.com/…

标签: java hql


【解决方案1】:

如果你使用jackson,你可以使用jacksons双向映射:

OuterEntity:

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

在 InnerEntity 中:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多