JPA 2.1 不生成模式脚本

Posted

技术标签:

【中文标题】JPA 2.1 不生成模式脚本【英文标题】:JPA 2.1 is not generating schema scripts 【发布时间】:2016-06-27 15:47:56 【问题描述】:

我使用 Hibernate 启动了 JPA 2.1,并在我的 persistence.xml 中有以下几行

<property name="javax.persistence.schema-generation.scripts.action" value="drop-and-create"/>
<property name="javax.persistence.schema-generation.scripts.create-target" value="META-INF/sampleCreate.ddl"/>
<property name="javax.persistence.schema-generation.scripts.drop-target" value="META-INF/sampleDrop.ddl"/>

这些表被生成到我的 postgres 数据库中。

但是,我的 META-INF 文件夹中没有 sampleCreate.dll,也没有错误。

这里缺少什么?是否生成到其他文件夹?

谢谢。

【问题讨论】:

persistence xml 看起来是正确的。我认为问题在于路径值。你能检查在 META-INF 之前添加 / 像 /META-INF/sampleCreate.ddl @TanviB 仍然没有出现。是否假设将 sampleCreate.ddl 生成到我的项目文件夹或其他文件夹中?如果我有 ,它可以正确检测 import.sql。 我有确切的问题!它只是不工作,没有生成脚本 【参考方案1】:

所以,我找到了解决方案,它不是完整的解决方案。

但还是这样。

首先,我使用的是Wildfly 10.1.0

我遇到了同样的问题,我没有看到我生成的 sql 文件。 但是经过一些实验我发现,当 Wildfly 部署我的应用程序时,它会在其 bin 目录 (C:\wildfly\bin\) 中生成 sql 文件。

但我想在我的项目源文件夹中看到它们。

为此,您应该使用 ABSOLUTE 路径。 像下面这样(它对我有用):

<property name="javax.persistence.schema-generation.scripts.action" value="drop-and-create"/>
<property name="javax.persistence.schema-generation.scripts.create-target" value="D:/myproject/src/resources/META-INF/sampleCreate.ddl"/>
<property name="javax.persistence.schema-generation.scripts.drop-target" value="D:/myproject/src/resources/META-INF/sampleDrop.ddl"/>

但是如果你在命令中编写代码,这不方便......

它如何与 Glassfish、SpringBoot 等配合使用。我不知道,但我认为它是一样的。

【讨论】:

【参考方案2】:

根据我的测试,这些文件是相对于您的 CWD(当前工作目录)创建的。

您可以通过执行以下操作来打印或记录System.getProperty("user.dir") 系统属性来查看此信息:

Getting the Current Working Directory in Java

我使用的是 maven,所以如果我使用 create.ddl 的路径执行 mvn test,我的脚本将在我运行 maven 的同一目录中创建。

要查找您的当前目录,请记录或打印 CWD 并相应地调整您的属性值。你也可以使用相对路径,所以如果我想把我的放在target/META-INF 目录中,我会使用./target/META-INF/create.ddl,因为那是相对于我的 CWD 的有效目录。

【讨论】:

以上是关于JPA 2.1 不生成模式脚本的主要内容,如果未能解决你的问题,请参考以下文章

从 JPA 注释的实体类自动生成数据模式

使用 JPA 2.1 生成元模型类

Flyway 或 Liquibase 可以生成更新脚本而不是直接更新数据库吗?

JPA 脚本生成重复语句

ORM 谁可以动态生成脚本

JPA 模式:从实体生成数据传输对象 DTO 并将 DTO 合并到数据库