Warum müssen wir manuell flush() des EntityManager in einem extended PersistenceContext?

In unserer J2EE-Anwendung verwenden wir eine EJB-3 stateful bean zu ermöglichen, die vor-code zu erstellen, ändern und speichern von persistenten Entitäten (managed durch JPA-2).

Es sieht wie folgt aus:

@LocalBean
@Stateful
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEntityController implements Serializable
{   
    @PersistenceContext(type = PersistenceContextType.EXTENDED)
    private EntityManager em;

    private MyEntity current;

    public void create()
    {
        this.current = new MyEntity();
        em.persist(this.current);
    }

    public void load(Long id)
    {
        this.current = em.find(MyEntity.class, id);
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void save()
    {
        em.flush();
    }
}

Sehr wichtig, um zu vermeiden, zu früh verpflichtet, nur die save() Methode innerhalb einer Transaktion ist, so nennen wir create() wir legen nichts in die Datenbank.

Neugierig, in der save() Methode, wir nennen em.flush() um wirklich der hit-Datenbank. In der Tat, ich habe versucht, und fand, dass wir es auch nennen em.isOpen() oder em.getFlushMode(), sowie alles, was ist "em-Bezug".

Verstehe ich nicht diesem Punkt. Als save() ist in einer Transaktion, dachte ich, dass am Ende der Methode wird die Transaktion committed, und so die persistenten entity-manager automatisch gespült. Warum muss ich manuell Spülen Sie es?

Dank,
Xavier

  • Keine Notwendigkeit zu flush(). joinTransaction() sollte genug sein, um die änderungen zu speichern in Ihren Transaktions-Methode.
Schreibe einen Kommentar