2009-06-04 16 views
10

Porque llamar a flush() para obtener todas las entidades persisten desde la memoria a la base de datos. Por lo tanto, si uso una llamada demasiado innecesaria flush(), podría tomar mucho tiempo, por lo tanto, no es una buena opción para el rendimiento. Aquí hay un escenario que no sé cuándo llamar a un flush()¿Es necesario llamar a flush() (interfaz JPA) en esta situación?

//Order and Item have Bidirectional Relationships 
Order ord = New ord("my first order"); 
Item item = New Item("tv",10); 

//...process item and ord object 

em.persist(ord);//em is an instance of EntityManager 
em.flush();// No.1 flush() 

item.setOrder(ord); 
em.persist(item); 

Set<Item> items= new HashSet<Item>(); 
items.add(item); 
ord.setItems(items); 

em.flush();// No.2 flush() 

Mi pregunta es: llamada del número 1 al ras podría evitar o no?

Lo que me preocupa es: para hacer el item.setOrder (ord), necesitamos una id de base de datos de ord. Y al llamar solo a em.persist (ord) no puedo generar una base de datos, así que tengo que llamar al em.flush() antes de item.setOrder (ord). Entonces, ¿cuál es tu opinión chicos?

Gracias de antemano.

Respuesta

4

i debe construir primero la estructura, y después de que persisten todo.

Order ord = New ord("my first order"); 
Item item = New Item("tv",10); 

item.setOrder(ord); 

Set<Item> items= new HashSet<Item>(); 
items.add(item); 
ord.setItems(items); 

em.persist(ord); 

De esta manera, persiste todo el árbol en una sola llamada y no se necesita color.

En el buen diseño de objetos, debe usar la forma descrita por duffymo para cablear sus objetos.

+0

¡Gracias, Salandur! sí, creo que podría hacer la constrcción de los objetos en estado transitorio y persistir el padre (si está en el archivo de mapeo, las colecciones de los niños se configuran en cascada). Finalmente pude hacer el color(). –

+0

¿Dijiste que flush() no es necesario? –

3

Creo que deberías estar haciendo todo esto en un contexto transaccional y dejar que resuelva estos problemas por ti.

necesita integrar la relación bidireccional en los objetos:

class Parent 
{ 
    private List<Child> children; 

    public boolean addChild(Child c) 
    { 
     c.setParent(this); // this is the key piece 

     return this.children.add(c); 
    } 
} 

class Child 
{ 
    private Parent parent; 

    public void setParent(Parent p) 
    { 
     this.parent = p; 
    } 
} 
+0

¡Gracias, tienes razón! y tu incrustación en la relación bidireccional puede aclarar mi código ahora! –

Cuestiones relacionadas