Problema en el administrador de entidades de búsqueda de jboss
-
24-09-2019 - |
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?
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?