Pregunta

Tengo mi proyecto ear implementado en jboss 5.1GA.

Desde la aplicación web no tengo problemas, ¡la búsqueda de mi ejb3 funciona bien!

es:

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

¡También la inyección de mi EntityManager funciona bien!

@PersistenceContext
private EntityManager manager;

Desde el entorno de prueba (yo uso Eclipse), la búsqueda del mismo ejb3 funciona bien.¡¡¡Pero la búsqueda de entidadmanager o PersistenceContext no funciona!!!

mi buen caso de prueba:

 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();
  }
 }

mi mala prueba:

   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

mi persistencia.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>

mi fuente de datos:

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

Necesito EntityManager y PersistenceContext para probar mi consulta antes de compilar ejb...

¿Dónde está mi error?

¿Fue útil?

Solución

Del lado del servidor EntityManager no puede ser serializado para que pueda utilizarlo como un EntityManager lado del cliente. Eso significaría que EntityManager hace referencia en el lado del cliente todavía puede hablar con la base de datos, el uso conjunto de conexiones, etc. Es imposible (pensar en cortafuegos, que protege el servidor de base de datos, por ejemplo).

Si usted necesita probar la APP, utilice EntityManager local, sin transacciones JTA. Si desea EJB pruebas que necesita para simular contenedor EJB conjunto. Puede utilizar la primavera Pitchfork o Glassfish 3 contenedor incorporado (esta última opción es más fácil).

Otros consejos

necesito para probar la APP, utilice EntityManager local, sin transacciones JTA!

He seguido su sugerencia: creé nueva persistence.xml con una nueva unidad de persistencia-

<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>

y en mi caso de prueba:

    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.");
    }

buen trabajo!

En mi proyecto Maven puse persistence.xml con tipo de persistencia unidad = "RESOURCE_LOCAL" en src / test / recursos

Y puse persistence.xml con el tipo persistence-unit = "JTA" en src / main / recursos

de esta manera Tengo dos separa ambiente. Uno para la prueba y otro para la producción.

que es una buena práctica?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top