【问题标题】:JPA: create database then connectJPA:创建数据库然后连接
【发布时间】:2014-03-20 22:02:21
【问题描述】:

我想在应用程序部署过程的第一次创建数据库。我正在使用 JPA。所以我考虑了两种方法。

1) 我的 persistence.xml 中有完整的连接描述:

<property name="mysql.jdbc.user" value="root"/>
<property name="mysql.jdbc.password" value=""/>
<property name="mysql.jdbc.url" value="jdbc:mysql://localhost:3306/DB"/>
<property name="mysql.jdbc.driver" value="com.mysql.jdbc.Driver"/>

当应用程序启动时,它无法连接到数据库并报告此问题建议转到安装页面。在此安装页面中,我使用显式 SQL 查询启动数据库创建。

2) 我连接到数据库服务器:

<property name="mysql.jdbc.user" value="root"/>
<property name="mysql.jdbc.password" value=""/>
<property name="mysql.jdbc.url" value="jdbc:mysql://localhost:3306/"/>
<property name="mysql.jdbc.driver" value="com.mysql.jdbc.Driver"/>

应用程序通知我这是第一次连接并将我重定向到安装页面。在数据库安装过程中,应修改 persistence.xml。必须将属性 mysql.jdbc.url 更改为声明数据库名称的新赋值。

您对此有何看法?如何做到这一点?

【问题讨论】:

  • 如果您正在测试,您可以使用 H2 创建数据库并在测试用例启动时生成架构。如果这是您有兴趣做的事情,请告诉我,我会发布更详细的解决方案。

标签: java jakarta-ee jpa


【解决方案1】:

我几乎可以肯定你不能使用 JPA 来创建数据库本身。

您需要手动创建它,或者考虑使用诸如Maven 之类的构建工具来创建它。

【讨论】:

    【解决方案2】:

    也许您应该使用persistence.xml 创建数据库。例如对于 JBoss,此属性如下所示:

    <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
    

    另外请寻找其他可能的值。

    【讨论】:

    • 这是 Hibernate 特有的属性。如果它在 JBoss 中工作,那仅仅是因为它使用 Hibernate 作为 JPA 实现。它可以在您使用 Hibernate 的任何时候工作。你的答案是正确的,只是要确保这不是 JBoss 特有的。
    • 你说得对。我的想法是框架在persistence.xml中有一个属性,我只是举了一个例子。
    【解决方案3】:

    您可以添加一个配置为在应用程序启动时运行(一次)的 servlet。这个 servlet 可以检查数据库是否已经存在,如果不存在,则以编程方式创建它。检查this question's answers 以了解如何为 MySQL 实现这一点。如果你有一个正在运行的服务器,你可以获得一个连接并运行 SQL 来创建数据库。之后,可以使用 JPA 实现的正确属性(如 Hibernate 中显示的 Nulldevice)自动创建必要的表等。

    您甚至可以让 servlet 定位 persistence.xml 文件,因为它无论如何都应该位于特定位置,并对其进行解析以找出 URL 等多个属性,以确保它们仅定义在一个位置。

    我不确定的是 JPA 是否只会在 servlet 运行后尝试连接(并可能创建表),或者如何强制这样做。为此,您可能必须检查 JavaEE 应用程序的生命周期。它也可能取决于 Application Server 供应商的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-20
      • 2010-12-14
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多