【问题标题】:Connection problems with EJB, JPA and EclipseEJB、JPA 和 Eclipse 的连接问题
【发布时间】:2011-12-07 18:04:00
【问题描述】:

我制作了一个非常简单的 Employee 类,仅用于学习目的。我在 Glassfish 中创建了一个 JDBC 资源和连接池,并将 JPA Facet 添加到我的 Eclipse 项目中。我现在只是尝试通过右键单击 Eclipse 项目并使用 JPA 工具和从实体生成表来从我的实体生成表。而且我还在eclipse中添加了数据库,并且已经连接上了。

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="TestAreaPU">
        <jta-data-source>jdbc/testareadb</jta-data-source>
    </persistence-unit>
</persistence>

员工实体

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String firstName;
    private String lastName;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

错误

[EL Warning]: PersistenceUnitInfo testareapu has transactionType RESOURCE_LOCAL and therefore jtaDataSource will be ignored
[EL Info]: EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504
[EL Fine]: Detected Vendor platform: org.eclipse.persistence.platform.database.JavaDBPlatform
[EL Config]: Connection(771811155)--connecting(DatabaseLogin(   platform=>JavaDBPlatform    user name=>"APP"    datasource URL=>"jdbc:derby://localhost:1527/testareadb;create=true" ))
[EL Config]: Connection(1028854205)--Connected: jdbc:derby://localhost:1527/testareadb;create=true  User: APP   Database: Apache Derby  Version: 10.6.2.1 - (999685)    Driver: Apache Derby Network Client JDBC Driver  Version: 10.8.1.2 - (1095077)
[EL Config]: Connection(414297791)--connecting(DatabaseLogin(   platform=>JavaDBPlatform    user name=> "APP"   datasource URL=>"jdbc:derby://localhost:1527/testareadb;create=true" ))
[EL Config]: Connection(960989763)--Connected: jdbc:derby://localhost:1527/testareadb;create=true   User: APP   Database: Apache Derby  Version: 10.6.2.1 - (999685)    Driver: Apache Derby Network Client JDBC Driver  Version: 10.8.1.2 - (1095077)
[EL Info]: file:/C:/Users/Andreas/TestAreaEJB/build/classes/_testareapu_url=jdbc:derby://localhost:1527/testareadb;create=true_user=APP login successful
[EL Warning]: The collection of metamodel types is empty. Model classes may not have been found during entity search for Java SE and some Java EE container managed persistence units.  Please verify that your entity classes are referenced in persistence.xml using either <class> elements or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element
[EL Config]: Connection(1028854205)--disconnect
[EL Info]: file:/C:/Users/Andreas/TestAreaEJB/build/classes/_testareapu_url=jdbc:derby://localhost:1527/testareadb;create=true_user=APP logout successful
[EL Config]: Connection(771811155)--disconnect
[EL Config]: Connection(960989763)--disconnect

新错误:

[EL Severe]: Local Exception Stack: 
Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot acquire data source [jdbc/testareadb].
Internal Exception: javax.naming.NamingException: Lookup failed for 'jdbc/testareadb' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]]
    at org.eclipse.persistence.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:485)
    at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:109)
    at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:582)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:206)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:472)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getDatabaseSession(EntityManagerFactoryDelegate.java:188)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:277)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:290)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:268)
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.perform(Main.java:86)
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.execute(Main.java:77)
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.main(Main.java:64)
Caused by: javax.naming.NamingException: Lookup failed for 'jdbc/testareadb' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]]
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:654)
    at javax.naming.InitialContext.lookup(InitialContext.java:396)
    at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:103)
    ... 11 more
Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:352)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504)
    ... 15 more
Caused by: java.lang.RuntimeException: Orb initialization erorr
    at org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:180)
    at com.sun.enterprise.naming.impl.SerialContext.getORB(SerialContext.java:365)
    at com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey(SerialContext.java:372)
    at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:402)
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:347)
    ... 16 more
Caused by: java.lang.NullPointerException
    at org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:152)
    ... 20 more

Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot acquire data source [jdbc/testareadb].
Internal Exception: javax.naming.NamingException: Lookup failed for 'jdbc/testareadb' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]]
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:501)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getDatabaseSession(EntityManagerFactoryDelegate.java:188)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:277)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:290)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:268)
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.perform(Main.java:86)
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.execute(Main.java:77)
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.main(Main.java:64)
Caused by: Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot acquire data source [jdbc/testareadb].
Internal Exception: javax.naming.NamingException: Lookup failed for 'jdbc/testareadb' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]]
    at org.eclipse.persistence.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:485)
    at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:109)
    at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:582)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:206)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:472)
    ... 7 more
Caused by: javax.naming.NamingException: Lookup failed for 'jdbc/testareadb' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]]
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:654)
    at javax.naming.InitialContext.lookup(InitialContext.java:396)
    at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:103)
    ... 11 more
Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:352)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504)
    ... 15 more
Caused by: java.lang.RuntimeException: Orb initialization erorr
    at org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:180)
    at com.sun.enterprise.naming.impl.SerialContext.getORB(SerialContext.java:365)
    at com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey(SerialContext.java:372)
    at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:402)
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:347)
    ... 16 more
Caused by: java.lang.NullPointerException
    at org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:152)
    ... 20 more

【问题讨论】:

  • 你在哪里配置连接(主机,密码,...)?以及如何执行此连接?这是容器事务(EJB、servlet、...)吗?还是瘦客户端(unitTest,...)?
  • 来自 Eclipse。我最近开始做Java EE,所以我还不知道JTA。

标签: java jakarta-ee jpa


【解决方案1】:

首先,如果我做实体,我想指定表名和列名:

@Entity
@Table (name = "Employee")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column (name = "firstName") //name is optional, default this is fieldName
    private String firstName;
    @Column (name = "lastName")
    private String lastName;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

如果你使用&lt;jta-data-source&gt;jdbc/testareadb&lt;/jta-data-source&gt;,这意味着你应该在服务器上配置资源,抛出 glasfish 管理控制台,其中 jdbc/testareadb 是资源的 JNDI 名称。 如果你只是初学者,我不建议你先做。

根据 JPA 2.0 规范参数transaction-type 是可选的,默认为resource-local 在瘦客户端和JTA 在容器事务。

而不是jta-data-source 更好地将属性添加到persistence.xml 上面的例子:

<persistence-unit name="Unit-name" >
<class>com.yourCompany.db.Employee</class>
<properties>
      <property name="eclipselink.target-database" value="DERBY"/>
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
      <property name="eclipselink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="eclipselink.jdbc.url" value="jdbc:derby://localhost:1527/chapter02DB;create=true"/>
      <property name="eclipselink.jdbc.user" value="userName"/>
      <property name="eclipselink.jdbc.password" value="userPassword"/>
    </properties>
</persistence-unit>

祝你好运!

【讨论】:

    【解决方案2】:

    你在persistence.xml 中肯定错过的(虽然这不是javax.naming.NamingException 的原因)是你的持久性类的列表——我不熟悉 EclipseLink,但这暗示了它:

    [EL Warning]: The collection of metamodel types is empty. (...)
    

    将类名添加到您的 persistence.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence (...)>
        <persistence-unit name="TestAreaPU">
            <jta-data-source>jdbc/testareadb</jta-data-source>
            <class>fully-qualified-name-of-Employee</class>
        </persistence-unit>
    </persistence>
    

    【讨论】:

      【解决方案3】:

      问题似乎出在您的 persistence.xml 中,当您定义 JTA 数据源 "jdbc/testareadb" 时,您实际上应该引用 Connection Pool 而不是 JDBC 资源

      例如,我的 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="MyAppPU" transaction-type="JTA">
              <jta-data-source>MyAppPool</jta-data-source>
          </persistence-unit>
      </persistence>
      

      然后我需要在 Glassfish 中创建一个名为 "jdbc/MyAppDS" 的 JDBC 资源和一个名为 "MyAppPool" 的连接池,我的 "MyAppPool" 将引用它强>persistence.xml。明白了吗?

      如果您不知道如何在 Glassfish 控制台上进行操作,请查看这篇文章: http://gardiary.wordpress.com/2009/07/30/create-jdbc-connection-pool-and-resource-in-glassfish/

      【讨论】:

      • 如果我的回答有帮助,请告诉我?
      【解决方案4】:

      您可能需要为您的环境定义一个数据源文件

      【讨论】:

        【解决方案5】:

        我认为 JTA 仅在 GlassFish 等容器中受支持,Eclipse 不支持。

        要么添加一个带有 transaction-type = "RESOURCE_LOCAL" 的持久性单元,然后从 Eclipse 中调用它来创建数据库

        将“;create=true”(对于 Apache Derby)添加到 GlassFish 配置中的连接 URL 并部署您的应用程序。

        您可能还想将 eclipselink.ddl-generation 属性设置为“create-tables”或“drop-and-create-tables”

        http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#Using_EclipseLink_JPA_Extensions_for_Schema_Generation

        【讨论】:

        • 这个答案对我有用,但每次我尝试构建项目时,它都会说实体没有被映射。
        • 你在使用 RESOURCE_LOCAL 吗?
        • 我在 Eclipse 3.7 中使用 Glassfish 3.1,但我找不到 JTA 链接来从表中生成实体以挽救我的生命。在过去的几个小时里一直在挖掘和挖掘,但无济于事。发布:stackoverflow.com/questions/12655257/…。请帮忙
        猜你喜欢
        • 2011-10-05
        • 2020-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        • 2016-12-27
        • 1970-01-01
        • 2014-08-08
        相关资源
        最近更新 更多