JPA + Hibernate(J2SE)@OneToMany - 数百万条记录减慢了添加新对象的速度

Mar*_*lze 6 java performance hibernate jpa

我在J2SE项目中使用JPA + Hibernate和PostGre SQL数据库.
我有2个实体一个.AB有@OneToMany关系.
在我的域模型一个可能会引用数百万的.当我向集合添加新对象时,需要几分钟才能完成.

@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());
Run Code Online (Sandbox Code Playgroud)

我认为JPA在插入新对象之前获取整个集合.是否有可能配置关系,以便通过向集合中添加新对象而不执行获取操作?

Viv*_*sse 4

使用 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...
    }

}
Run Code Online (Sandbox Code Playgroud)