我在J2SE项目中将JPA + Hibernate与PostGre SQL数据库一起使用。
我有2个实体 A 和 B 。 A 与 B 具有@OneToMany关系。
在我的域模型中, A 可能引用了数百万个 B 。当我向集合中添加新对象时,需要几分钟的时间才能完成。
@OneToMany(cascade=CascadeType.PERSIST)
Collection<B> foo = new ArrayList<B>(); // might contain millions of records
//...
// this takes a lot of time
foo.add(new B());
我认为JPA会在插入新对象之前获取整个集合。
是否可以配置关系,以便通过将新对象添加到集合中而不会执行提取操作?
最佳答案
使用JPA时,将延迟加载@OneToMany关系。这意味着对foo的任何调用都将导致JPA加载数据库中引用的所有条目。
我知道避免这种情况的唯一方法是反转您的关系,并在B上定义一个@ManyToOne关系(指向A)。这样,您就不需要加载要在数据库中插入新对象的集合。
这是一个代码示例:
public class B {
@ManyToOne
private A a;
public void foo() {
A a = new A();
B b = new B();
b.setA(a); // Instead of a.getFoo().add(b);
// Persist b in database...
}
}
关于performance - JPA + Hibernate(J2SE)@OneToMany-数百万条记录减慢了添加新对象的速度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3600999/