Hibernate (4) vers JPA

Dans le cadre d’une migration d’un applicatif tournant sous JBoss AS 7 il est désormais voulu passer de l’objet SessionFactory vers son pendant en JPA : EntityManagerFactory.

Via JNDI JBoss expose l’objet EntityManagerFactory avec la propriété suivante dans le fichier persistence.xml :

<property name="jboss.entity.manager.factory.jndi.name" value="java:/jboss/MyEntityManagerFactory" />

Le problème c’est qu’actuellement tout le code de notre application exploite un SessionFactory et il n’est pas question de repasser partout où un SessionFactory est exploité pour le remplacer par un EntityManagerFactory.

En regardant, en mode debug, quelle est la classe implémentant EntityManagerFactory sous Hibernate on trouve qu’il s’agit de la classe org.hibernate.ejb.EntityManagerFactoryImpl. En regardant son code source via grepcode (içi) et pour la version 4.0.1 d’Hibernate (celle exploitée par JBoss AS 7.1.1.Final) on s’aperçoit qu’un objet SessionFactory est directement embarqué dans l’implémentation.

Au final il suffit donc d’utiliser ce code :

SessionFactory sessionFactory = ((EntityManagerFactoryImpl) entityManagerFactory)
    .getSessionFactory();

Note : cette classe se trouve dans le JAR jboss-as-7.1.1.Final/modules/org/hibernate/main/hibernate-entitymanager-4.0.1.Final.jar

A noter qu’il y a une deuxième possibilité : préciser à Hibernate d’exposer l’objet SessionFactory via JNDI. Cela s’effectue via une propriété dans le fichier persistence.xml :


<property name="hibernate.session_factory_name" value="java:/hibernate/HibernateVPCFactory" />

Cette solution n’a cependant pas été retenue pour forcer l’exploitation d’un objet EntityManagerFactory. Mais après rien n’empêche le développeur de récupérer un SessionFactory cependant la méthode permettant de le faire a été marquée @Deprecated pour lui indiquer d’utiliser EntityManagerFactory.

Publicités

2 réponses à “Hibernate (4) vers JPA

  1. jean 12 décembre 2013 à 09:49

    Bonjour,
    Merci pour cet article.
    J’ai suis entrain de faire une migration jboss 5 vers jboss 7.1.1.final et je n’arrive pas à me retrouver, je suis très confus
    Avant j’utilisais un har pour deployer mon service hibernate :

    java:jboss/datasources/xxx1
    java:jboss/datasources/xxx2
    java:jboss/datasources/xxx3
    java:jboss/datasources/xxx4

    Cette config ne fonctionne plus sur jboss 7 et je cherche un equivalent afin de pouvoir utiiser la sessionfactory hibernate.

    Pourriez-vous m’aider svp, je cherche depuis plusieurs jours en vain.

    Merci,

  2. jean 12 décembre 2013 à 09:52

    balises supprimer:
    fichier : service-hibernate.xml

    hibernate-configuration xmlns= »urn:jboss:hibernate-deployer:1.0″
    session-factory name= »java:jboss/hibernate/SessionFactory » bean= »jboss.har:service=Hibernate »

    datasourceName : java:jboss/datasources/xxx1
    datasourceName : java:jboss/datasources/xxx2
    datasourceName : java:jboss/datasources/xxx3
    datasourceName : java:jboss/datasources/xxx4

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