Java EJB、JPA和Eclipse的连接问题

Java EJB、JPA和Eclipse的连接问题,java,jakarta-ee,jpa,Java,Jakarta Ee,Jpa,我制作了一个非常简单的Employee类,只是为了学习。我在Glassfish中创建了一个JDBC资源和连接池,并将JPA方面添加到我的Eclipse项目中。我现在正试图通过右键点击Eclipse项目并使用JPA工具从实体生成表来从实体生成表。我还在eclipse中添加了数据库,并与之连接 Persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http:/

我制作了一个非常简单的Employee类,只是为了学习。我在Glassfish中创建了一个JDBC资源和连接池,并将JPA方面添加到我的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>
错误


我认为JTA只在GlassFish这样的容器中受支持,而不是Eclipse

添加一个事务类型为“RESOURCE\u LOCAL”的持久化单元,并从Eclipse调用它来创建数据库

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

您可能还希望将eclipselink.ddl-generation属性设置为“创建表”或“删除并创建表”


我认为JTA只在GlassFish这样的容器中受支持,Eclipse不支持

添加一个事务类型为“RESOURCE\u LOCAL”的持久化单元,并从Eclipse调用它来创建数据库

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

您可能还希望将eclipselink.ddl-generation属性设置为“创建表”或“删除并创建表”


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

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

当您定义JTA数据源“jdbc/TestReadB”时,问题似乎出在您的persistence.xml中您实际上应该引用连接池,而不是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>

MyAppPool
然后我需要在Glassfish上创建一个名为“JDBC/MyAppDS”的JDBC资源和一个名为“MyAppPool”的连接池,该连接池将被我的persistence.xml引用。明白了吗

如果您不知道如何在Glassfish控制台上执行此操作,请参阅本文:
问题似乎出在您的persistence.xml中,当您定义JTA数据源“jdbc/TestReadB”时,您应该实际引用连接池而不是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>

MyAppPool
然后我需要在Glassfish上创建一个名为“JDBC/MyAppDS”的JDBC资源和一个名为“MyAppPool”的连接池,该连接池将被我的persistence.xml引用。明白了吗

如果您不知道如何在Glassfish控制台上执行此操作,请参阅本文:
persistence.xml
中,您肯定会错过的是持久性类的列表(虽然这不是
javax.naming.NamingException
),我不熟悉EclipseLink,但这表明:

[EL Warning]: The collection of metamodel types is empty. (...)
将类名添加到persistence.xml中:


jdbc/TestReadB
雇员的完全限定名

persistence.xml
中,您肯定会错过的是您的持久性类列表(我不熟悉EclipseLink,但这表明:

[EL Warning]: The collection of metamodel types is empty. (...)
将类名添加到persistence.xml中:


jdbc/TestReadB
雇员的完全限定名

首先,如果我使用实体,我希望指定表名和列名:

@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;
    }
}
如果您使用
jdbc/testareadb
,这意味着您应该在服务器上配置资源,抛出glasfish管理控制台,其中jdbc/testareadb是资源的JNDI名称。 如果你只是这方面的初学者,我不建议你先这样做

根据JPA 2.0规范,在瘦客户机上,
事务类型
是可选的,在容器事务上默认为
资源本地

与其使用jta数据源,不如向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>

com.yourCompany.db.Employee

祝你好运

首先,如果我使用实体,我希望指定表名和列名:

@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;
    }
}
如果您使用
jdbc/testareadb
,这意味着您应该在服务器上配置资源,抛出glasfish管理控制台,其中jdbc/testareadb是资源的JNDI名称。 如果你只是这方面的初学者,我不建议你先这样做

根据JPA 2.0规范,在瘦客户机上,
事务类型
是可选的,在容器事务上默认为
资源本地

与其使用jta数据源,不如向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>

com.yourCompany.db.Employee

祝你好运

您在哪里配置连接(主机、密码等)?您如何执行此连接?这是一个容器事务(EJB、servlet等)?或者Eclipse的瘦客户端(unitTest,…)。我最近开始做JavaEE,所以我还不知道JTA。在哪里配置连接(主机、密码等)?您如何执行此连接?这是一个容器事务(EJB、servlet等)?或者Eclipse的瘦客户端(unitTest,…)。我最近开始学习Java EE,所以我还不知道JTA。你能告诉我我的答案是否有用吗?你能告诉我我的答案是否有用吗?这个答案对我有用,但每次我尝试构建项目时,它都会说实体没有映射。您使用的是RESOURCE_LOCAL吗?我使用的是Glassfish 3.1和Eclipse 3.7,我可以