【问题标题】:Reverse engineer DDL from JPA entities从 JPA 实体逆向工程 DDL
【发布时间】:2010-10-21 05:42:31
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: java hibernate orm jpa ddl


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      我认为 JPA 没有通用的方法,您必须直接使用底层的 JPA 实现来实现。

      对于Hibernate,有几种可能:

      • 使用之前发布的duffymo 方法,让Hibernate 自动更新数据库架构。
      • 如果你不想这样,你可以使用Hibernate Toolshbm2ddl 工具(注意:链接很烂,但显然他们的主页现在有点坏了)。您可以使用它从您的 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)可能有自己的特定方法来实现这一点。

      【讨论】:

        【解决方案3】:

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

        --安迪 (DataNucleus)

        【讨论】:

          【解决方案4】:

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

          对于休眠:

          创建:

          <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"/>
          

          【讨论】:

            【解决方案5】:

            加入詹姆斯麦克马洪的名单:

            对于 OpenJPA:

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

            【讨论】:

              【解决方案6】:

              我使用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?

              【讨论】:

                【解决方案7】:

                通过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>
                

                【讨论】:

                  【解决方案8】:

                  Antonio Goncalves 在他的 blog 中谈到了 API 来生成模式。
                  为此,在 JPA 2.1 中引入了generateSchema 方法。

                  博客示例:

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

                  【讨论】:

                    猜你喜欢
                    • 2017-04-08
                    • 2021-09-29
                    • 2015-08-05
                    • 1970-01-01
                    • 2012-09-06
                    • 2015-12-12
                    • 1970-01-01
                    • 2013-12-14
                    • 2019-09-24
                    相关资源
                    最近更新 更多