Container managed EntityManager
Bonjour,
Je n'arrive pas à faire gérer mon EntityManager par JBoss. Cela m'oblige actuellement à le récupéré via une Factory et à le fermer à la main. Du coup je ne profite pas du lazy-fetching d'Hibernate.
Mon architecture est la suivante :
- Ma couche Présentation, qui appelle :
- Ma couche Services Métier en EJB 2, qui appelle :
- Ma couche DAO
- Une couche Objets Métier avec des EJB Entity référencée par les trois autres.
J'ai lu qu'il avait deux manières de récupérer un EntityManager managé par le conteneur :
- par injection,
- ou par JNDI.
La première solution ne me convient pas puisqu'il faudrait, si j'ai bien compris, que mes DAO soit des EJB également. J'essaie donc de passer par JNDI.
J'ai donc mon persistence.xml :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="manager1" transaction-type="JTA">
<jta-data-source>java:/jdbc/test_db</jta-data-source>
<properties>
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="jboss.entity.manager.jndi.name" value="java:/EntityManager1" />
</properties>
</persistence-unit>
</persistence> |
Et dans mon DAO :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public List<ProfilOM> getProfils() {
EntityManager em;
try {
em = (EntityManager) new InitialContext().lookup("java:/EntityManager1");
} catch (NamingException e) {
e.printStackTrace();
}
Query q = em.createQuery("from ProfilOM");
List<ProfilOM> profils = new ArrayList<ProfilOM>(q.getResultList());
em.close();
return profils;
} |
Mais impossible de le récupérer ainsi. J'obtiens l'erreur javax.naming.NameNotFoundException: EntityManager1 not bound et em reste à null.
Bien que j'ai réussi à me débrouiller jusque là, je suis un peu perdu dans la jungle JPA/JTA/Hibernate/EJB que je comprend en partie mais suis loin de maîtriser.
Est-ce que quelqu'un saurait d'où vient le problème ou pourrait me mettre sur une piste ?
Cordialement.