JBoss AS 7, UserTransaction et new Thread()

Quand, dans JBoss AS 7, on utilise Hibernate 4 le UserTransaction est récupéré automatiquement depuis l’adresse JNDI java:jboss/TransactionManager.

Cependant si un EJB crée un nouveau Thread (new Thread()) et que ce dernier a besoin d’exploiter ce UserTransaction cela provoque une exception indiquant que le UserTransaction ne peut pas être trouvé. La faute en est à la classe org.hibernate.service.jta.platform.internalJBossAppServerJtaPlatform qui récupère le UserTransaction avec un nom JNDI qui correspond aux anciennes version de JBoss : java:comp/UserTransaction.

Ainsi pour résoudre ce problème il suffit de créer une nouvelle classe qui étend la classe JBossAppServerJtaPlatform qui, pour Hibernate 4, doit être configurée par le fichier persistence.xml et par la propriété hibernate.transaction.jta.platform .

public class MyJBossAppServerJtaPlatform extends JBossAppServerJtaPlatform {

	public static final String UT_NAME = "java:jboss/UserTransaction";

	@Override
	protected UserTransaction locateUserTransaction() {
		return (UserTransaction) jndiService().locate(UT_NAME);
	}
}

Cette nouvelle classe retrouve le UserTransaction avec le bon nom JNDI. Pour l’exploiter il suffit juste de change la propriété hibernate.transaction.manager_lookup_class (toujours dans le fichier persistence.xml) :

<property name= »hibernate.transaction.jta.platform » value= »my.package.MyJBossAppServerJtaPlatform » />

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s