Pourquoi ne nous avez manuellement flush() de l'EntityManager dans une étendue PersistenceContext?

Dans notre application J2EE, nous utilisons un EJB-3 stateful bean pour permettre à l'avant code pour créer, modifier et enregistrer les entités persistantes (géré par JPA-2).

Il ressemble à quelque chose comme ceci:

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

Très important, pour éviter trop tôt s'engage, seul le save() méthode est à l'intérieur d'une transaction, de sorte que si nous appelons create(), nous insérez rien dans la base de données.

Curieusement, dans le save() méthode, nous devons appeler em.flush() afin de vraiment frapper la base de données. En fait, j'ai essayé et constaté que nous pouvons aussi appeler em.isOpen() ou em.getFlushMode(), bien tout ce qui est "em".

Je ne comprends pas ce point. Comme save() est dans une transaction, j'ai pensé que, à la fin de la méthode, la transaction sera validée, et donc la persistance de l'entité gestionnaire automatiquement supprimées. Pourquoi dois-je rincer manuellement?

Grâce,
Xavier

Pas besoin de flush(). joinTransaction() devrait être suffisant pour enregistrer vos modifications dans votre méthode.

OriginalL'auteur Xavier Portebois | 2011-09-01