代码之家  ›  专栏  ›  技术社区  ›  Marc-Christian Schulze

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

  •  6
  • Marc-Christian Schulze  · 技术社区  · 14 年前

    我正在J2SE项目中使用JPA+Hibernate和postgresql数据库。
    我有两个实体 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 回复  |  直到 14 年前
        1
  •  4
  •   Vivien Barousse    14 年前

    @使用JPA时,OneToMany关系是延迟加载的。这意味着对foo的任何调用都将导致JPA加载数据库中引用的所有条目。

    下面是一个代码示例:

    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...
        }
    
    }
    
        2
  •  1
  •   Arthur Ronald    14 年前

    改为使用属性访问

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