【问题标题】:Create a Derby DB in Glassfish and connect to Java EE application在 Glassfish 中创建 Derby DB 并连接到 Java EE 应用程序
【发布时间】:2017-02-18 01:33:26
【问题描述】:

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

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

数据库的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 资源中)。我该怎么办?

非常感谢您的任何帮助。

【问题讨论】:

  • Glassfish 的最新版本已损坏,当您尝试在“jdbc 资源”中单击新建时,您会遇到一个很好的异常。太好了。
  • 你考虑过使用payara还是wildfly?
  • 如果您花这么多时间使用 GF,payara 不会有任何痛苦的过渡,但如果您是 GF 新手,我强烈建议您使用 WildFly。
  • 我必须在课堂上使用 glassfish。之后我会调查 WildFly,无论如何,谢谢!

标签: java jpa jakarta-ee glassfish derby


【解决方案1】:

要为 EE 容器配置 PersistenceUnit,您必须使用 jta-data-sourcetransaction-type="JTA"。对于jta-data-source,您必须指定 JDBC ConnectionPool 的 JNDI 名称,该名称必须在 EE 容器(在您的情况下为 glassfish 服务器)中配置。有教程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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2011-01-07
    • 2016-02-16
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    相关资源
    最近更新 更多