2011-01-21 17 views
5

Birim testinde ecbDB JTA veri kaynağını bulamıyorum.Derbi gömülü veritabanı için Java EE 6 uygulamasında EclipseLink/JPA 2.0'da JTA veri kaynağı nasıl ayarlanır?

RESOURCE_LOCAL için aynı persistence.xml çalışır. Sadece bir EJB konteynerinde bir JTA veri kaynağının yerini tespit edemez. Ben istisna aşağıdaki birim test yürütülür olsun

.. İşte

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) 

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

Bu yol, bu kod jpa1.0 ile openjpa ile çalışıyordu. ancak eclipselink ve jpa2.0 ile; Yukarıdaki kodla, kaynağın tanımlanıp kaydedilmediğini düşünüyorum. –

cevap

0

İlk emin derbi yapılandırması ile (uygun bir JDBC kaynak var yapmaktır kabuk komutu "asadmin list-jdbc-resources"). Değilse, "asadmin create-jdbc-resource" ile bir tane yapın. Yardım için "asadmin liste komutları" yazın.

+0

Gömülü derbi kullanıyorum. Birim testinde gömülü derbi ile jdbc kaynağını nasıl tanımlayabilirim? –

+0

İstisnalar alıyorum .. Dahili Özel Durum: java.sql.SQLException: Bir bağlantı ayırmada hata. Neden: Bağlantı kurulamadı çünkü: java.net.ConnectException: İleti reddedildi: bağlantı noktası ile bağlantı noktası 1527'de sunucu yerel sunucusuna bağlanırken hata oluştu: bağlan. Hata Kodu: 0 \t at org.eclipse.persistence.exceptions.DatabaseException.sqlException (DatabaseException.java:309) –

+0

Bağlantı noktası 1527'de sunucuya bağlanamaya dair bir ileti alıyorsanız, o halde Gömülü Derby kullanarak, İstemci/Sunucu Derby kullanıyorsunuz ve Ağ Sunucunuz çalışmıyor. –

0

Bunu yerleşik Glassfish altında mı çalıştırıyorsunuz? Eğer öyleyse sorun şu ki, onun bir JTA veri kaynağına sahip olması nedeniyle domain.xml dosyasında ecbDB tanımlanmamıştır. Bu durumda Kaster'ın cevabı doğru yoldadır ve gömülü bağlantı havuzunuzu ve ilişkili JDBC kaynağını oluşturmanız gerekir. Asadmin komutunu veya Glassfish web yönetici GUI'sini kullanabilirsiniz. Bu noktada, iki javax.persistence.jdbc özelliğini persistence.xml öğesinden de kaldırmanız gerekir, çünkü bu ayarlar bağlantı havuzu kaynak ayarlarınız tarafından birleştirilir.

1

İşte EclipseLink ile JTA tabanlı bağlantı kurmak için kullandım adım adım bir açıklama.

Birincisi, emin olun:

  • GlassFish sunucusu yukarı ve yukarı

    asadmin list-domains

  • Apache Derby sunucu çalıştıran ve

    NetworkServerControl.bat sysinfo -h localhost -p 1527

çalışan

Sonraki, JDBC Bağlantı Havuz ve JDBC Kaynağı yaratmak

  • org.apache.derby.jdbc.EmbeddedDataSource

asadmin create-jdbc bağlantı havuzu kullanan JDBC Bağlantı Pool oluşturmak
--datasourceclassname org .apache.derby.jdbc.EmbeddedDataSource
--restype javax.sql.XADataSource
--property databaseName = ecbDB: serverName = localhost: portNumber = 1527: Parola = APP: user = APP: connectionAttributes = \; \ = true EmbeddedPool

  • oluşturmak
JDBC Kaynağı yaratmak

asadmin oluşturmak-JDBC kaynak


y ise EmbeddedPool JDBC/EmbeddedResource --connectionpoolid Eğer yeni düğümler görürsünüz:

Kaynaklar> JDBC> JDBC Bağlantı Havuzlar> EmbeddedPool
Kaynaklar> JDBC> JDBC Kaynakları> jdbc/EmbeddedResource
: ou GlassFish Yönetim Konsolu bir göz (4848localhost) almak

Gördüğünüz gibi EmbeddedPool'a jdbc/EmbeddedResource atanmıştır. Bu Java için tercih edilen bir stratejidir bildiği gibi bileşenler kadarıyla (kalıcılık operasyonlarını yönetmek üzere

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

kullanın vatansız/durum bilgisi oturumu fasulye:


Sonra persistence.xml en az bir sürümünü yaratmak EE uygulamaları):

public interface ECBService { 
} 

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

Kullanım ayarlayıcı enjeksiyon ünitesi test durumunda) (a alana kullanışlı bağlam bağımlılığını adlandırma ortamı atamak için:

public class ECBServlet extends HttpServlet { 
    private ECBService service; 

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

Son olarak, dağıtım aşağıdaki üretir:

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) 

ben yardımcı olur.

İlgili konular