在Glassfish中创建Derby数据库并连接到Java EE应用程序

时间:2017-02-18 01:33:27

标签: java jpa java-ee glassfish derby

我正在尝试编写一个使用JPA访问数据库的Java EE应用程序。到目前为止,我只使用@Entity注释并将其他所有内容保留为默认状态(例如,persistence.xml文件使用_TimerPool作为jta-data-source,而我没有创建任何数据库)。

所以我想尝试使用实际的数据库。我进入了服务界面,JavaBD>创建新数据库,使用名称和密码进行设置。

DB&#39> url:jdbc:derby:// localhost:1527 / Prova

然后我通过Glassfish的向导为我的应用程序创建了persistence.xml文件:

  <persistence-unit name="JobsPU" transaction-type="JTA">
    <jta-data-source>java:app/Prova</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.schema-generation.database.action" value="create"/>
      <property name="javax.persistence.schema-generation.database.target" value="database-and-scripts"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/Prova"/>
      <property name="javax.persistence.jdbc.user" value="paolo"/>
      <property name="javax.persistence.jdbc.password" value="paolo"/>
    </properties>
  </persistence-unit>

当我尝试部署时,我得到了这个例外:

    Grave:   Exception while preparing the app : Invalid resource : { ResourceInfo : (jndiName=java:app/Prova__pm), (applicationName=Jobs) }
com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Invalid resource : { ResourceInfo : (jndiName=java:app/Prova__pm), (applicationName=Jobs) }

似乎与JNDI命名有关。我真的不知道,我还在努力学习。如果我去Glassfish的控制台,在JNDI列表下,我看不到任何与我的数据库相关的东西(不在JDBC连接池和JDBC资源中)。我该怎么办?

非常感谢您提前寻求帮助。

1 个答案:

答案 0 :(得分:0)

要为EE容器配置PersistenceUnit,您必须使用jta-data-sourcetransaction-type="JTA"。对于jta-data-source,您必须指定必须在EE容器(在您的情况下为glassfish服务器)中配置的JDBC ConnectionPool的JNDI名称。有教程How to set up a JDBC Connection Pool on Glassfish。同样在这种情况下PersistenceUnit属性如

 <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/Prova"/>
      <property name="javax.persistence.jdbc.user" value="paolo"/>
      <property name="javax.persistence.jdbc.password" value="paolo"/>
EE容器将忽略

(请参阅this documentation)。 要使用此属性,您可以为SE环境配置PersistenceUnit。在此之前,我建议您阅读文章differences between RESOURCE_LOCAL and JTA persistence contexts。 SE应用程序的配置如下所示:

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
    <provider>
        org.eclipse.persistence.jpa.PersistenceProvider
    </provider>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/Prova"/>
        <property name="javax.persistence.jdbc.user" value="paolo"/>
        <property name="javax.persistence.jdbc.password" value="paolo"/>
    </properties>
</persistence-unit>