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

时间:2010-08-30 13:57:20

标签: performance hibernate jpa java

我在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在插入新对象之前会抓取整个集合。 是否有可能配置关系,以便通过向集合中添加新对象而不执行获取操作?

2 个答案:

答案 0 :(得分: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...
    }

}

答案 1 :(得分:1)

改为使用属性访问

@OneToMany(cascade=CascadeType.PERSIST)
public Collection<B> getFoo() {
    return foo;
}

JPA实现使用代理。但它在使用属性访问策略时才有效