Resolviendo problemas de Hibernate en Beans con Managed Transactions bajo JBoss

Si tienes una Bean etiquetada con @TransactionManagement(TransactionManagementType.BEAN) y recibes excepciones como éstas:

javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
   at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
   at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
   at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:255)
   ...
   at java.lang.Thread.run(Unknown Source)
 Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
   at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
   at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
   at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
   at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
   at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
   at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
   at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
   at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1700)
   at org.hibernate.loader.Loader.doQuery(Loader.java:801)
   at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
   at org.hibernate.loader.Loader.doList(Loader.java:2533)
   at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
   at org.hibernate.loader.Loader.list(Loader.java:2271)
   at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
   at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
   at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
   at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
   at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
   at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:246)
   ... 32 more
 Caused by: org.jboss.util.NestedSQLException: Transaction is not active: tx=TransactionImple < ac, BasicAction: 0:ffff0a021e29:126a:4f6095ab:c1 status: ActionStatus.ABORT_ONLY >; -
not active: tx=TransactionImple < ac, BasicAction: 0:ffff0a021e29:126a:4f6095ab:c1 status: ActionStatus.ABORT_ONLY >)
   at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:95)
   at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:71)
   at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
   ... 46 more
 Caused by: javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: 0:ffff0a021e29:126a:4f6095ab:c1 status: ActionStatus.ABORT_ONLY >
   at org.jboss.resource.connectionmanager.TxConnectionManager.getManagedConnection(TxConnectionManager.java:403)
   at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:496)
   at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:941)
   at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:89)
   ... 48 more

El problema se debe a la forma en que se manejan las transacciones. En ocasiones se resuelve con éstos dos consejos:

  • Añadiendo un verificador al especificador de Datasource (explicación):
    <valid-connection-checker-class-name> com.mysql.jdbc.integration.jboss.MysqlValidConnectionChecker </valid-connection-checker-class-name>
  • Seguir el patrón de uso de las transacciones que se puede leer aquí

A mi me ha ayudado mucho, ¡espero que os ayude a vosotros!

Happy coding!

Solucionando errores: EntityManager must be access within a transaction

Trabajando con una Bean Container-Managed (autogestionada por el contenedor, JBoss en éste caso) que utiliza Hibernate, en ocasiones puede surgir la siguiente excepción:

javax.persistence.TransactionRequiredException: EntityManager must be access within a transaction
     at org.jboss.jpa.deployment.ManagedEntityManagerFactory.verifyInTx(ManagedEntityManagerFactory.java:157)
     at org.jboss.jpa.deployment.PersistenceUnitDeployment.verifyInTx(PersistenceUnitDeployment.java:318)
     at org.jboss.jpa.impl.tx.TransactionScopedEntityManager.verifyInTx(TransactionScopedEntityManager.java:105)
     at org.jboss.jpa.impl.tx.TransactionScopedEntityManager.joinTransaction(TransactionScopedEntityManager.java:115)
     at ...

Hay que asegurarse que nuestra bean tiene las anotaciones correspondientes y accede al Entity Manager de la forma correcta. He aquí un ejemplo de cómo debería hacerse (sin dudar de que seguramente haya una forma mejor, por favor, si la conoces añade un comentario, ¡gracias!):

@Singleton(name="BeanPrueba")
@Remote(BeanPruebaRemote.class)
public class BeanTetra implements BeanTetraRemote
{
	...

    // Definimos el contexto de persistencia a usar
    @PersistenceContext(unitName = "Persistencia")
    private EntityManager em;

	...

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    private void guardarSegmentos(ArrayList elementos)
    {
		...

		// Guardamos el objeto en la persistencia
		this.em.persist(objeto);

		...
	}

	...
}

¡Espero que os ayude! ¡Happy coding!

Solucionando errores con JBoss: Persistence provider caller does not implement the EJB3 spec correctly

Seguimos con los errores provocados al lanzar una aplicación a JBoss. Tras solucionar el problema anterior, ya mucho más felices, la sonrisa se nos vuelve a congelar en la cara cuando recibimos ésto:

11:48:05,557 WARN  [org.hibernate.ejb.Ejb3Configuration] Persistence provider caller does not implement the EJB3 spec correctly.PersistenceUnitInfo.getNewTempClassLoader() is null.

¿Otra vez? ¡Demonios!

La solución: ignorar el mensaje, como se puede leer aquí. Yo lo he hecho en mis proyectos y parece que todo funciona correctamente. Curioso.

Me reitero en que espero que le sirva de utilidad a alguien. ¡A disfrutar!


Disclaimer: Las imágenes mostradas en ésta página web se utilizan sólamente con propósitos ilustrativos, y son propiedad de sus respectivos autores (cuando es aplicable).
Hijo de Blog es un producto del Dr. SeROne

Los contenidos se ofrecen bajo una licencia de Creative Commons
Attribution-NonCommercial-NoDerivs 3.0 Unported

salvo que se indique lo contrario

Licencia de Creative Commons