2011-01-21 9 views
5

Nie mogę znaleźć źródła danych ecaDB JTA w teście jednostki.Jak skonfigurować źródło danych JTA w EclipseLink/JPA 2.0 w aplikacji Java EE 6 dla wbudowanej bazy danych Derby?

Dla RESOURCE_LOCAL działa ten sam plik persistence.xml. Tylko w kontenerze EJB nie uda się zlokalizować źródła danych JTA.

otrzymuję następujący wyjątek, gdy badanie wykonywane jest jednostka ..

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) 

Oto 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

W ten sposób ten kod pracował z jpa1.0 z openjpa. , ale z eclipselink i jpa2.0; Myślę, że z powyższym kodem desorpcja nie jest zdefiniowana/zarejestrowana. –

Odpowiedz

0

Najpierw upewnij się konfiguracja Twój Derby mieć odpowiedni zasób JDBC (z polecenie powłoki "asadmin list-jdbc-resources"). Jeśli nie, zrób jeden z "asadmin create-jdbc-resource". Aby uzyskać pomoc, wpisz "asadmin list-commands".

+0

Używam zagnieżdżonych derby. Z osadzonymi derami w teście jednostek, jak mogę zdefiniować zasób jdbc? –

+0

Otrzymuję wyjątek .. Wewnętrzny wyjątek: java.sql.SQLException: błąd w przydzielaniu połączenia. Przyczyna: Nie można przydzielić połączenia, ponieważ: java.net.ConnectException: Błąd podczas łączenia się z serwerem localhost na porcie 1527 z komunikatem Odmowa połączenia: połącz. Kod błędu: 0 \t w org.eclipse.persistence.exceptions.DatabaseException.sqlException (DatabaseException.java:309) –

+0

Jeśli otrzymujesz komunikat o braku połączenia z serwerem na porcie 1527, to nie jesteś przy użyciu wbudowanego narzędzia Derby używasz narzędzia Derby klienta/serwera, a serwer sieciowy nie działa. –

0

Czy używasz tego w wersji Embedded Glassfish? Jeśli tak, problem, który widzisz, polega na tym, że ma on źródło danych JTA, którego ecbDB nie jest zdefiniowane w pliku domain.xml. W takim przypadku odpowiedź Kastra znajduje się na właściwej ścieżce i powinieneś utworzyć swoją osadzoną pulę połączeń i powiązany zasób JDBC. Możesz użyć polecenia asadmin lub GUI administratora Glassfish. W tym momencie powinieneś również usunąć dwie właściwości javax.persistence.jdbc z pliku persistence.xml, ponieważ te ustawienia zostaną powiązane z ustawieniami zasobów puli połączeń.

1

Oto opis krok po kroku, za pomocą którego skonfigurowałem połączenie oparte na JTA z EclipseLink.

Po pierwsze, upewnij się, że:

  • serwera GlassFish jest uruchomiony

    asadmin list-domains

    serwer
  • Apache Derby jest uruchomiony

    NetworkServerControl.bat sysinfo -h localhost -p 1527


Następnie należy utworzyć połączenia JDBC basen i JDBC zasób

  • tworzyć JDBC puli połączeń, który używa org.apache.derby.jdbc.EmbeddedDataSource

asadmin kreacji JDBC połączeniowy basen
--datasourceclassname org .apache.derby.jdbc.EmbeddedDataSource
--restype javax.sql.XADataSource
--property databasename = ecbDB: serverName = localhost: portNumber = 1527: password = APP: user = APP: connectionAttributes = \; tworzyć \ = true EmbeddedPool

  • tworzyć JDBC zasób

asadmin create-JDBC-resource --connectionpoolid EmbeddedPool jdbc/EmbeddedResource


jeżeli Y ou przyjrzeć GlassFish Administration Console (localhost: 4848) można zauważyć nowe węzły:

Zasoby> JDBC> pula połączeń JDBC> EmbeddedPool
Zasoby> JDBC> JDBC Resources> jdbc/EmbeddedResource

Jak widać jdbc/EmbeddedResource został przypisany do EmbeddedPool.


Następnie utwórz minimalną wersję 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> 

Stosować bezpaństwowców/stanowe sesja fasoli jako komponenty do zarządzania operacjami utrzymującymi się (o ile wiem, jest to preferowana strategia dla Java aplikacje EE):

public interface ECBService { 
} 

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

Zastosowanie wtrysku ustawiająca przypisać środowiska nazewnictwa zależność kontekstu w dziedzinie (użyteczne w przypadku badania jednostkę)

public class ECBServlet extends HttpServlet { 
    private ECBService service; 

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

Wreszcie, wdrażanie produkuje następujące:

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) 

Mam nadzieję, że to pomaga.