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?

¿Fue útil?

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

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top