2010-08-30 9 views
6

Sto utilizzando JPA + Hibernate con un database SQL PostGre in un progetto J2SE.
Ho 2 entità A e B. A ha una relazione @OneToMany su B.
Nel mio modello di dominio Un potrebbe fare riferimento milioni di B 's. Quando aggiungo un nuovo oggetto alla raccolta ci vogliono minuti per essere completato.JPA + Hibernate (J2SE) @OneToMany - Milioni di record rallenta l'aggiunta di un nuovo oggetto in basso

@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()); 

Penso che JPA recuperi l'intera raccolta prima di inserire il nuovo oggetto. Esiste la possibilità di configurare la relazione in modo che, aggiungendo un nuovo oggetto alla raccolta, non venga eseguita alcuna operazione di recupero?

risposta

3

@OneToAlcune relazioni sono pigre quando si utilizza JPA. Ciò significa che qualsiasi chiamata a pippo comporterà il caricamento in JPA di tutte le voci a cui si fa riferimento nel database.

L'unico modo che so per evitare questo è di invertire la relazione e definire una relazione @ManyToOne su B (che punta a A). In questo modo, non hai una raccolta che deve essere caricata per inserire un nuovo oggetto nel tuo database.

Ecco un esempio di codice:

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

Usa l'accesso alle proprietà invece

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

implementazioni JPA fa uso di proxy. Ma funziona solo quando si utilizza la strategia di accesso alle proprietà

Problemi correlati