我有一个包含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,还要保存所有类别和屏幕快照中的所有内容。
答案 0 :(得分:0)
我能够解决此问题。该问题是由多对多关系的双向性质引起的。这导致该类别还在保存之前从数据库查询所有应用程序。因为这不是我想要的,所以我通过从Category类中删除myApplicationSet使其变为单向关系来解决了该问题。现在仅构造了25个MyApplication实例即可保存25个应用程序,并且我的内存使用情况保持稳定。