En nuestra aplicación J2EE, utilizamos un bean stateful EJB-3 para permitir que el código frontal cree, modifique y guarde entidades persistentes (administradas a través de JPA-2).¿Por qué tenemos que enjuagar manualmente() el EntityManager en un PersistenceContext extendido?
se ve algo como esto:
@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();
}
}
muy importante, para evitar demasiado pronto compromete, sólo el método save()
está dentro de una transacción, por lo que si llamamos create()
, insertamos nada en la base de datos.
Curiosamente, en el método save()
, tenemos que llamar al em.flush()
para llegar a la base de datos. De hecho, probé y descubrí que también podemos llamar al em.isOpen()
o al em.getFlushMode()
, y todo lo relacionado con "em".
No entiendo este punto. Como save()
está en una transacción, pensé que al final del método, la transacción se confirmará y, por lo tanto, el administrador de entidad persistente se vació automáticamente. ¿Por qué tengo que vaciarlo manualmente?
Gracias, Xavier
No es necesario 'flush()'. 'joinTransaction()' debería ser suficiente para guardar sus modificaciones en su método transaccional. –