2011-01-21 24 views
5

No puedo encontrar el origen de datos de ecbDB JTA en la prueba unitaria.¿Cómo configurar un origen de datos JTA en EclipseLink/JPA 2.0 en una aplicación Java EE 6 para la base de datos derby embedded?

Para RESOURCE_LOCAL funciona el mismo persistence.xml. Solo dentro de un contenedor EJB falla al ubicar una fuente de datos JTA.

me sale el siguiente excepción cuando se ejecuta la prueba de la unidad ..

SEVERE: Exception while invoking class org.glassfish.persistence.jpa.JPADeployer prepare method 
java.lang.RuntimeException: javax.naming.NamingException: Lookup failed for 'ecbDB' in SerialContext [Root exception is javax.naming.NameNotFoundException: ecbDB not found] 
at org.glassfish.persistence.jpa.PersistenceUnitInfoImpl.<init>(PersistenceUnitInfoImpl.java:111) 

Aquí es persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<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_2_0.xsd" 
    version="2.0"> 

    <persistence-unit name="ecbPU" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>ecbDB</jta-data-source> 
     <mapping-file>META-INF/orm.xml</mapping-file> 

     <properties> 
      <property 
       name="javax.persistence.jdbc.driver" 
       value="org.apache.derby.jdbc.EmbeddedDriver" /> 
      <property 
       name="javax.persistence.jdbc.url" 
       value="jdbc:derby:target/ecbDB;create=true" /> 

      <!-- EclipseLink 2.0 properties --> 
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> 
      <property name="eclipselink.ddl-generation.output-mode" 
         value="sql-script" /> 
      <!-- <property name="eclipselink.ddl-generation.output-mode" value="database" 
      /> --> 
      <property name="eclipselink.application-location" value="./target/ddl" /> 
      <property name="eclipselink.create-ddl-jdbc-file-name" 
         value="create.sql" /> 
      <property name="eclipselink.drop-ddl-jdbc-file-name" value="drop.sql" /> 
      <property name="eclipselink.logging.level" value="ALL" /> 
      <property name="eclipselink.logging.file" value="./target/eclipselink.logs" /> 
     </properties> 
    </persistence-unit> 
</persistence> 
+0

De esta manera este código estaba trabajando con jpa1.0 con openjpa. pero con eclipselink y jpa2.0; Creo que con el código anterior, el origen no se está definiendo/registrando. –

Respuesta

0

En primer lugar hacer su configuración derby seguro de tener un recurso JDBC adecuado (con el comando de shell "asadmin list-jdbc-resources"). Si no, crea uno con "asadmin create-jdbc-resource". Para ayuda, escriba "asadmin list-commands".

+0

Estoy usando derby integrado. Con Derby integrado en prueba unitaria, ¿cómo puedo definir el recurso jdbc? –

+0

Recibo la excepción. Excepción interna: java.sql.SQLException: error al asignar una conexión. Causa: no se pudo asignar la conexión porque: java.net.ConnectException: Error al conectarse al servidor localhost en el puerto 1527 con el mensaje Conexión rechazada: connect. Código de error: 0 \t en org.eclipse.persistence.exceptions.DatabaseException.sqlException (DatabaseException.java:309) –

+0

Si recibe un mensaje sobre la falla al conectarse al servidor en el puerto 1527, entonces no está usando Derby integrado, estás usando Client/Server Derby, y tu Network Server no está activo. –

0

¿Está ejecutando esto en Glassfish incrustado? Si es así, el problema que está viendo es que tiene un origen de datos JTA. EcbDB no está definido en su dominio.xml. En ese caso, la respuesta de Kaster está en el camino correcto y debe crear su grupo de conexiones incorporadas y el recurso JDBC asociado. Puede usar el comando asadmin o la GUI de administrador web de Glassfish. En ese momento, también debe eliminar las dos propiedades javax.persistence.jdbc de su persistence.xml porque la configuración de recursos de su grupo de conexiones cubrirá esas configuraciones.

1

Aquí hay una descripción paso a paso que he usado para configurar la conexión basada en JTA con EclipseLink.

En primer lugar, asegúrese de que:

  • servidor GlassFish está en funcionamiento

    asadmin list-domains

    servidor
  • Apache Derby está en marcha y funcionando

    NetworkServerControl.bat sysinfo -h localhost -p 1527


A continuación, cree agrupación de conexiones JDBC y JDBC de Recursos

  • crear JDBC piscina conexión que utiliza org.apache.derby.jdbc.EmbeddedDataSource

asadmin create-jdbc-connection-pool
--datasourceclassname org .apache.derby.jdbc.EmbeddedDataSource
--restype javax.sql.XADataSource
--property de databaseName = ecbDB: serverName = localhost: portNumber = 1527: password = APP: user = APP: connectionAttributes = \; crear \ = true EmbeddedPool

  • crear JDBC de Recursos

asadmin create-JDBC-recursos --connectionpoolid EmbeddedPool JDBC/EmbeddedResource


Si y ou echar un vistazo a la consola de administración de GlassFish (localhost: 4848) se dará cuenta de nuevos nodos:

Recursos> JDBC> JDBC agrupaciones de conexiones> EmbeddedPool
Recursos> JDBC> Recursos JDBC> JDBC/EmbeddedResource

Como puede ver jdbc/EmbeddedResource ha sido asignado a EmbeddedPool.


A continuación, cree una versión mínima de persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 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_2_0.xsd"> 
    <persistence-unit name="ecbPU"> 
     <jta-data-source>jdbc/EmbeddedResource</jta-data-source> 
     <properties> 
      <property name="eclipselink.logging.level" value="FINE"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

Use beans de sesión sin/con estado como componentes para administrar las operaciones de persistencia (por lo que sé que esto es la estrategia preferida para Java aplicaciones EE):

public interface ECBService { 
} 

@Stateless 
public class ECBServiceBean implements ECBService { 
    @PersistenceContext(unitName = "ecbPU") 
    protected EntityManager em; 
} 

uso inyección setter para asignar ambiente nombrar dependencia del contexto en un campo (útil en caso de pruebas de unidad):

public class ECBServlet extends HttpServlet { 
    private ECBService service; 

    @EJB 
    public void setECBService(EcbService service) { 
     this.service = service; 
    } 
} 

Por último, el despliegue produce lo siguiente:

INFO: EclipseLink, version: Eclipse Persistence Services - 2.5.0.v20130507 
FINE: Detected database platform: org.eclipse.persistence.platform.database.JavaDBPlatform 
CONFIG: connecting(DatabaseLogin(
    platform=>DatabasePlatform 
    user name=> "" 
    connector=>JNDIConnector datasource name=>null 
)) 
CONFIG: Connected: jdbc:derby:ecbDB 
    User: APP 
    Database: Apache Derby Version: 10.10.1.1 - (1458268) 
    Driver: Apache Derby Embedded JDBC Driver Version: 10.10.1.1 - (1458268) 
CONFIG: connecting(DatabaseLogin(
    platform=>JavaDBPlatform 
    user name=> "" 
    connector=>JNDIConnector datasource name=>null 
)) 
CONFIG: Connected: jdbc:derby:ecbDB 
    User: APP 
    Database: Apache Derby Version: 10.10.1.1 - (1458268) 
    Driver: Apache Derby Embedded JDBC Driver Version: 10.10.1.1 - (1458268) 

espero que ayude.

Cuestiones relacionadas