Question

J'ai mon oreille projet déployé dans jboss 5.1GA.

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

es:

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

aussi iniection de mon EntityManager beau travail!

@PersistenceContext
private EntityManager manager;

De ambience test (j'utiliser Eclipse) la recherche du même travail ejb3 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 EntityManager et PersistenceContext pour tester ma requête avant build ... ejb

Où est mon erreur?

Était-ce utile?

La solution

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é sur le côté client peut encore parler à la base de données, utiliser la piscine de connexion, etc. Il est impossible (penser 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 EJBs vous devez simuler tout le conteneur EJB. Vous pouvez utiliser Spring Pitchfork ou Glassfish 3 conteneur embarqué (cette dernière option est plus facile).

Autres conseils

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

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

<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 avec le type persistence-unit = "JTA" dans src / main / resources

de cette façon que j'ai deux enviroment sépare. Un pour le test et l'autre pour la production.

il est une bonne pratique?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top