JPA + Hibernate (J2SE) @OneToMany - миллионы записей замедляют добавление нового объекта - PullRequest
6 голосов
/ 30 августа 2010

Я использую JPA + Hibernate с базой данных PostGre SQL в проекте J2SE.
У меня есть 2 сущности A и B . A имеет отношение @OneToMany к B .
В моей модели домена 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 ]

4 голосов
/ 30 августа 2010

@ Отношения OneToMany загружаются лениво при использовании JPA. Это означает, что любой вызов foo приведет к загрузке JPA всех записей, на которые есть ссылки в базе данных.

Единственный способ избежать этого, который я знаю, - это изменить ваши отношения и определить отношение @ManyToOne для B (указывая на 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 голос
/ 30 августа 2010

Использовать доступ к свойству вместо

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

В реализациях JPA используются прокси. Но это работает только при использовании стратегии доступа к свойству

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...