使用manyToMany关系使用休眠进行低效保存

时间:2019-07-03 19:12:40

标签: java hibernate

我有一个包含25个MyApplication对象的列表,我想使用hibernate / JPA保存这些对象。这可以通过以下方法完成:

MyApplicationRepository.saveAll(myAppList);

但是我注意到,在将25个清单插入/更新数据库时,hibernate创建了60.000个MyApplication对象(接近于该实体在数据库中已记录的总数)。我没有很多冬眠的经历,这使我相信我创建了效率低下的实体关系。 MyApplication类的一部分:

public class MyApplication {
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "APPLICATION_CATEGORY", joinColumns = {
            @JoinColumn(name = "applicationid", nullable = false, updatable = false) },
            inverseJoinColumns = { @JoinColumn(name = "categoryid",
                    nullable = false, updatable = false) })
    private Set<Category> categorySet;


    @OneToMany(mappedBy = "myApplication", 
                  cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Screenshot> screenshotSet;
}

类别类(MyApplication的多对多关系中的一个例子):

public class Category {
    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "categorySet")
    private Set<MyApplication> myApplicationSet;
}

截屏类:

public class Screenshot {
    @ManyToOne
    @JoinColumn(name = "applicationid")
    private MyApplication myApplication;
}

我做错了什么导致保存时Hibernate创建了如此多的MyApplication实例?

注1:最后,MyApplication的所有信息以及其类别和屏幕截图的信息都正确地保存在数据库中。

注2:重要的是,不仅要保存MyApplication,还要保存所有类别和屏幕快照中的所有内容。

1 个答案:

答案 0 :(得分:0)

我能够解决此问题。该问题是由多对多关系的双向性质引起的。这导致该类别还在保存之前从数据库查询所有应用程序。因为这不是我想要的,所以我通过从Category类中删除myApplicationSet使其变为单向关系来解决了该问题。现在仅构造了25个MyApplication实例即可保存25个应用程序,并且我的内存使用情况保持稳定。