EntityManager lanza TransactionRequiredException en merge () en el frijol JBoss JSF
-
23-08-2019 - |
Pregunta
He creado una aplicación JSF en JBoss 5.0.1GA para presentar una lista de usuarios en una tabla y permitir la eliminación de los usuarios individuales a través de un botón situado junto a cada usuario.
Cuando deleteUser se llama, la llamada se pasa a un UserDAOBean que obtiene un EntityManager inyecta desde JBoss.
Estoy utilizando el código
public void delete(E entity)
{
em.remove(em.merge(entity));
}
para eliminar el usuario (código era c & p de un tutorial JPA). Sólo llamaba em.remove (entidad) no tiene ningún efecto y todavía hace que la misma excepción.
Cuando se alcanza esta línea, me estoy poniendo un TransactionRequiredException:
(se pierden aparentemente irrelevantes StackTrace-cosas)
...
20: 38: 06 406 ERROR [[Faces Servlet]] Servlet.service () para Faces servlet Servlet lanzó excepción javax.persistence.TransactionRequiredException: EntityManager debe ser de acceso dentro de una transacción en org.jboss.jpa.deployment.ManagedEntityManagerFactory.verifyInTx (ManagedEntityManagerFactory.java:155) a org.jboss.jpa.tx.TransactionScopedEntityManager.merge (TransactionScopedEntityManager.java:192) a at.fhj.itm.utils.DAOImplTemplate.delete (DAOImplTemplate.java:54) a at.fhj.itm.UserBean.delete (UserBean.java:53) a sun.reflect.NativeMethodAccessorImpl.invoke0 (Nativo Método)
...
Ya he probado para envolver una transacción gestionada de forma manual (em.getTransaction (). Begin () + .commit ()) alrededor de ella, pero esto fracasó porque no está permitido dentro del contenedor de JBoss. Yo no tenía éxito con UserTransaction tampoco. Búsquedas en la web para este problema también se presentaron ningún caso y solución similar.
¿Alguien ha experimentado algo similar antes y encontró una solución a esto?
Solución
Encontrados el eslabón perdido.
Era de hecho una transacción que falta pero la solución no era usar el EntityManager para manejarlo, pero para añadir un UserTransaction inyectado.
@Resource
UserTransaction ut;
...
public void delete(E entity)
{
ut.begin();
em.remove(em.merge(entity));
ut.commit();
}
Gracias a todas las sugerencias que de alguna manera más de 100 esquinas llevan a esta solución.
Otros consejos
Sé que esto es una vieja pregunta, pero por si acaso alguien se tropieza en este como yo.
Trate
em.joinTransaction();
em.remove(bean);
em.flush();
Eso es lo que utilizamos en todos nuestros frijoles @Stateful.
Si está utilizando la costura, también puede utilizar la anotación @Transactional(TransactionPropagationType.REQUIRED)
.
¿Está seguro de que usted anotada frijol con @Stateless o cuando se registra con XML?
Trate de añadir anotaciones de transacción para que el código, esto puede ayudarle a:
@TransactionAttribute(REQUIRED)
public void delete(E entity)
{
em.remove(em.merge(entity));
}
Sin embargo, parece extraño, porque este es el valor por defecto si no se establece de forma explícita.
Sólo una nota: nos encontramos con este mismo problema hoy en día, resultó que alguien había marcado el EJB como TransactionAttributeType.NOT_SUPPORTED y el método como TransactionAttributeType.REQUIRED, haciendo que el em.merge a fallar por falta de transacciones
.