java—不要多次获取子选择相同的实体

5f0d552i  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(544)

按子选定实体的id获取时出现问题
这里是结构

public class A {

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

    //Other class members;
    }
public class B {

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

    @ValueRestriction("NOTNULL")
    @ManyToOne
    @JoinColumn(name = "C_ID")
    private C c;

    @ValueRestriction("NOTNULL")
    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "A_ID")
    private A a;
    //Other class members;
}
public class C {

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

    @JsonIgnore
    @OneToMany(mappedBy = "c")
    @Fetch (FetchMode.SELECT)
    private List<B> bs;

    @ValueRestriction("NOTNULL")
    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "A_ID")
    private A a;
    //Other class members;
}

所以当我们结束冬眠的时候

em().find(B.class, id);

hibernate查询还获取c实体中a的列。这将导致一个更大的实体结构

target lists can have at most 1664 entries

(这是一个简单的演示)
在我们的例子中,我们需要在所有这些子实体中引用实体a
如果同一个对象是ame,我们如何防止hibernate多次获取它。
在我们的案例中,实体b和实体c中的a总是相同的。实体b的a实体与c实体不同的情况在我们的结构中是不可能的。

scyqe7ek

scyqe7ek1#

问题是 @ManyToOne 以及 @OneToOne 默认情况下,执行快速获取。切换到延迟获取 @ManyToOne(fetch = LAZY) 为了避免这种情况。

相关问题