Как настроить источник данных JTA в EclipseLink / JPA 2.0 в приложении Java EE 6 для встроенной базы данных derby? - PullRequest
5 голосов
/ 21 января 2011

Я не могу найти источник данных ecbDB JTA в модульном тесте.

Для RESOURCE_LOCAL работает тот же файл persistence.xml. Только в контейнере EJB не удается найти источник данных JTA.

Я получаю следующее исключение при выполнении модульного теста ..

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>

Ответы [ 3 ]

1 голос
/ 28 ноября 2013

Вот пошаговое описание, которое я использовал для установки соединения на основе JTA с EclipseLink.

Сначала убедитесь, что:

  • сервер GlassFishзапущен и работает

    asadmin list-domains

  • Сервер Apache Derby запущен и работает

    NetworkServerControl.bat sysinfo -h localhost -p 1527


Далее создайте пул соединений JDBC и ресурс JDBC

  • создайте пул соединений JDBC, который использует org.apache.derby.jdbc.EmbeddedDataSource

asadmin create-jdbc-подключение бассейн--datasourceclassname org.apache.derby.jdbc.EmbeddedDataSource--restype javax.sql.XADataSource--property databaseName = ecbDB: serverName = localhost: portNumber = 1527: пароль = APP: пользователь = APP: connectionAttributes = \; create \ = true EmbeddedPool

  • создать ресурс JDBC

asadmin create-jdbc-resource --conconctionpoolid EmbeddedPool jdbc / EmbeddedResource

Если вы посмотрите на Консоль администрирования GlassFish ( localhost: 4848 ), вы заметите новые узлы:

Ресурсы> JDBC> Пулы соединений JDBC> EmbeddedPoolРесурсы> JDBC> Ресурсы JDBC> jdbc / EmbeddedResource

Как вы можете видеть, jdbc/EmbeddedResource был присвоен EmbeddedPool.


Затем создайтеминимальная версия 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>

Использование сессионных компонентов без сохранения состояния или состояния в качестве компонентов для управления операциями сохранения (насколько я знаю, это предпочтительная стратегия для приложений Java EE):

public interface ECBService {
}

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

Использовать установку сеттера для назначения зависимости контекста именования среды в поле (полезно в случае модульного тестирования):

public class ECBServlet extends HttpServlet {
    private ECBService service;

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

Наконец, развертывание производит следующее:

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)

Надеюсь, это поможет.

0 голосов
/ 22 марта 2011

Вы запускаете это под встроенным Glassfish?Если это так, то проблема, с которой вы сталкиваетесь, заключается в том, что у него есть источник данных JTA. EcbDB не определен в вашем domain.xml.В этом случае ответ Кастера находится на правильном пути, и вы должны создать свой встроенный пул соединений и связанный ресурс JDBC.Вы можете использовать команду asadmin или графический интерфейс веб-администратора Glassfish.На этом этапе вам также следует удалить два свойства javax.persistence.jdbc из вашего файла persistence.xml, поскольку эти параметры будут отображаться в настройках ресурса пула соединений.

0 голосов
/ 22 января 2011

Сначала убедитесь, что в вашей конфигурации derby есть подходящий ресурс JDBC (с помощью команды оболочки «asadmin list-jdbc-resources»). Если нет, создайте его с помощью «asadmin create-jdbc-resource». Для получения справки введите "asadmin list-команды".

...