我在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/

10-11 02:03