从JPA实体反向工程DDL

时间:2009-04-22 22:12:50

标签: java hibernate orm jpa ddl

我正在玩一些JPA的东西,更改映射以了解它们应该是什么样的等等。这是基本的实验。但是我找不到一个简单地读取我的实体然后为我生成表模式的工具。我试图在JBoss工具中找到类似的东西,但是nada。 Eclipse集成将是一个巨大的优势,但我将采用命令行工具或ant任务。

有什么想法吗?

8 个答案:

答案 0 :(得分:16)

尝试将以下内容添加到persistence.xml

对于Hibernate:

创建:

<property name="hibernate.hbm2ddl.auto" value="update"/>

删除并创建:

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

对于Toplink:

创建:

<property name="toplink.ddl-generation" value="create-tables"/>

删除并创建:

<property name="toplink.ddl-generation" value="drop-and-create-tables"/>

对于EclipseLink:

创建:

<property name="eclipselink.ddl-generation" value="create-tables"/>

删除并创建:

<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>

答案 1 :(得分:8)

我认为使用JPA有一种通用的方法,你必须直接使用底层的JPA实现来实现这一点。

对于 Hibernate ,有几种可能性:

  • 使用前面发布的方法duffymo,这使得Hibernate自动更新数据库架构。
  • 如果您不想这样,可以使用Hibernate Tools中的 hbm2ddl 工具(注意:链接很糟糕,但显然他们的主页现在有点破了)。您可以使用它从JPA实体自动生成数据库创建脚本;还有Maven和Ant的插件可以自动调用hbm2ddl

对于 EclipseLink (以前的Oracle TopLink,JPA 2.0 RI),请参阅Using EclipseLink JPA Extensions for Schema Generation。原则上它与Hibernate非常相似,虽然乍一看我没有看到任何可以用作创建数据库脚本的独立实用程序。

其他JPA实现(BEA / Oracle Kodo,Apache OpenJPA)可能有自己特定的实现方法。

答案 2 :(得分:6)

当我使用Hibernate时,我只需将其添加到我的配置文件中:

      <property name="hbm2ddl.auto">update</property>

照顾好一切。我不确定JPA的等价物是什么,但它受Hibernate的影响很大,如果你找不到类似的东西,我会感到惊讶。

无需工具。我通常只运行一个简单的JUnit测试,并为我创建数据库。

答案 3 :(得分:5)

通过maven插件:

        <plugin>
            <!-- run "mvn hibernate3:hbm2ddl" to generate a schema -->
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>hibernate3-maven-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <hibernatetool>
                    <classpath>
                        <path location="${project.build.directory}/classes" />
                        <path location="${project.basedir}/src/main/resources/META-INF/" />                                               
                    </classpath>   

                    <jpaconfiguration persistenceunit="galleryPersistenceUnit" />                     
                    <hbm2ddl create="true" export="false" destdir="${project.basedir}/target" drop="true" outputfilename="mysql.sql" format="true" console="true"/>
                </hibernatetool>
            </configuration>
        </plugin>

答案 4 :(得分:4)

我使用Hibernate的org.hibernate.tool.hbm2ddl.SchemaExport类和这个小方法来

在数据库中生成架构:

 public static void rebuildSchema()
 {
     configuration = new Configuration();
     configuration.configure();

     new SchemaExport(configuration)
         .setHaltOnError(true)
         .execute(false, true, false, false);
 }

要在外部文件中创建DDL,请使用此调用execute

     new SchemaExport(configuration)
         .setHaltOnError(true)
         .setOutputFile(outputFile)
         .setImportFile("")
         .setDelimiter(";")
         .setFormat(true)
         .execute(false, false, false, true);

将“hibernate.hbm2ddl.auto”设置为“update”被认为是错误的形式,因为自动更改生产数据库可能会破坏它。有关说明,请参阅Hibernate hbm2ddl.auto possible values and what they do?

答案 5 :(得分:2)

DataNucleus有自己的SchemaTool,能够为您生成架构,或生成所需的DDL语句,供您自行调整和应用。

- 安迪(DataNucleus

答案 6 :(得分:2)

添加到James McMahon的名单中:

对于OpenJPA:

<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>

答案 7 :(得分:0)

安东尼奥·贡卡尔维斯在他的blog中提到有关生成模式的API 在JPA 2.1中generateSchema方法是为此目的而引入的。

博客示例:

public class Main {
    public static void main(String[] args) {
        Persistence.generateSchema("samplePU", null);
    }
}