2010-03-05 5 views
0

J'ai mon oreille-projet déployé dans jboss 5.1GA.Problème sur jboss lookup entitymanager

De webapp je n'ai pas de problème, la recherche de mon ejb3 fonctionne très bien!

es:

ShoppingCart sc= (ShoppingCart) 
(new InitialContext()).lookup("idelivery-ear-1.0/ShoppingCartBean/remote"); 

aussi iniection de mon EntityManager beau travail! De l'environnement de test (j'utilise Eclipse) la recherche du même ejb3 fonctionne très bien! mais la recherche de entitymanager ou PersistenceContext ne fonctionne pas !!!

mon bon cas de test:

public void testClient() { 

    Properties properties = new Properties(); 
    properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory"); 
    properties.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces"); 
    properties.put("java.naming.provider.url","localhost"); 

    Context context; 
    try{ 
    context = new InitialContext(properties); 
    ShoppingCart cart = (ShoppingCart) context.lookup("idelivery-ear-1.0/ShoppingCartBean/remote"); // WORK FINE 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 

mon mauvais test:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("idelivery"); 
    EntityManager em = emf.createEntityManager(); //test1 


    EntityManager em6 = (EntityManager) new InitialContext().lookup("java:comp/env/persistence/idelivery"); //test2 


    PersistenceContext em3 = (PersistenceContext)(new InitialContext()).lookup("idelivery/remote"); //test3 

mon persistence.xml

<persistence-unit name="idelivery" transaction-type="JTA"> 
    <jta-data-source>java:ideliveryDS</jta-data-source> 
    <properties> 
     <property name="hibernate.hbm2ddl.auto" value="create-drop" /><!--validate | update | create | create-drop--> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="true" /> 
    </properties> 
</persistence-unit> 

ma source de données:

<datasources> 
    <local-tx-datasource> 
     <jndi-name>ideliveryDS</jndi-name> 
        ... 
    </local-tx-datasource> 
    </datasources> 

J'ai besoin de EntityManager et PersistenceContext pour tester ma requête avant de construire ejb ...

Où est mon erreur?

Répondre

0

EntityManager côté serveur ne peut pas être sérialisé de sorte que vous pouvez l'utiliser comme un EntityManager côté client. Cela signifierait que EntityManager référencé côté client peut encore parler à la base de données, utiliser le pool de connexion, etc. C'est impossible (pensez au pare-feu, qui protège le serveur de base de données, par exemple).

Si vous devez tester JPA, utilisez EntityManager local sans transactions JTA. Si vous voulez tester des EJB, vous devez simuler un conteneur EJB entier. Vous pouvez utiliser le conteneur intégré Spring Pitchfork ou Glassfish 3 (la dernière option est plus facile).

+0

merci! Je vais essayer maintenant. – Stefano

0

Je dois tester JPA, utiliser EntityManager local sans transactions JTA!

J'ai suivi votre suggestion: je créé de nouvelles persistence.xml avec une nouvelle persistance unité

<persistence-unit name="ideliveryTest" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>it.idelivery.model.Category</class> 
    <class>it.idelivery.model.User</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/application"/> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/> 
     <property name="hibernate.hbm2ddl.auto" value="create-drop"/> 
     <property name="hibernate.connection.username" value="root"/> 
     <property name="hibernate.connection.password" value=""/> 
    </properties> 
</persistence-unit> 

et dans mon cas de test:

try { 
     logger.info("Building JPA EntityManager for unit tests"); 
     emFactory = Persistence.createEntityManagerFactory("ideliveryTest"); 
     em = emFactory.createEntityManager(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
     fail("Exception during JPA EntityManager instanciation."); 
    } 

beau travail!

Dans mon projet Maven j'ai mis persistence.xml avec le type persistence-unit = "RESOURCE_LOCAL" dans src/test/ressources

et je mets persistence.xml de type persistence-unit = "JTA" dans src/principal/ressources

de cette façon, j'ai deux environnements séparés. Un pour le test et un pour la production.

c'est une bonne pratique?