【问题标题】:How to setup a JTA data source in EclipseLink/JPA 2.0 in an Java EE 6 application for derby embedded database?如何在 Java EE 6 应用程序中为 derby 嵌入式数据库设置 EclipseLink/JPA 2.0 中的 JTA 数据源?
【发布时间】:2011-06-13 01:18:33
【问题描述】:

我无法在单元测试中找到 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>

【问题讨论】:

  • 这样,这段代码就可以与 jpa1.0 和 openjpa 一起使用。但是使用eclipselink和jpa2.0;我认为使用上面的代码,desource 没有被定义/注册。

标签: eclipselink derby


【解决方案1】:

这是我用来设置基于 JTA 与 EclipseLink 的连接的分步说明。

首先,确保:

  • GlassFish 服务器已启动并正在运行

    asadmin list-domains

  • Apache Derby 服务器已启动并正在运行

    NetworkServerControl.bat sysinfo -h localhost -p 1527


接下来,创建 JDBC 连接池和 JDBC 资源

  • 创建使用org.apache.derby.jdbc.EmbeddedDataSource的JDBC连接池

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

  • 创建 JDBC 资源

asadmin create-jdbc-resource --connectionpoolid 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>

使用无状态/有状态会话 bean 作为组件来管理持久性操作(据我所知,这是 Java EE 应用程序的首选策略):

public interface ECBService {
}

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

使用 setter 注入将环境命名上下文依赖项分配到字段中(在单元测试的情况下很有用):

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)

希望对你有帮助。

【讨论】:

    【解决方案2】:

    您是在嵌入式 Glassfish 下运行它吗?如果是这样,您看到的问题是因为他有一个 JTA 数据源 ecbDB 未在您的 domain.xml 中定义。在这种情况下,Kaster 的答案是正确的,您应该创建嵌入式连接池和关联的 JDBC 资源。您可以使用 asadmin 命令或 Glassfish Web 管理 GUI。此时,您还应该从您的 persistence.xml 中删除两个 javax.persistence.jdbc 属性,因为这些设置将通过您的连接池资源设置进行转换。

    【讨论】:

      【解决方案3】:

      首先确保您的 derby 配置具有合适的 JDBC 资源(使用 shell 命令“asadmin list-jdbc-resources”)。如果没有,请使用“asadmin create-jdbc-resource”制作一个。如需帮助,请键入“asadmin list-commands”。

      【讨论】:

      • 我正在使用嵌入式 derby。在单元测试中使用嵌入式 derby 如何定义 jdbc 资源?
      • 我收到异常。内部异常:java.sql.SQLException:分配连接时出错。原因:无法分配连接,因为:java.net.ConnectException:连接到端口 1527 上的服务器 localhost 时出错,并显示消息连接被拒绝:连接。错误代码:org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:309) 处为 0
      • 如果您收到关于无法连接到端口 1527 上的服务器的消息,那么您没有使用嵌入式 Derby,您使用的是客户端/服务器 Derby,并且您的网络服务器没有起来。
      猜你喜欢
      • 2011-05-22
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 2021-06-02
      • 2012-08-08
      • 2018-07-12
      • 2012-09-23
      • 1970-01-01
      相关资源
      最近更新 更多