如何从java代码为我的jpa实体创建一个ddl?

时间:2009-06-30 17:28:25

标签: java hibernate jpa ddl

我想方设法为我的jpa注释实体创建一个ddl。 我更喜欢纯粹的java方式。

如果可能的话,也可以生成drop语句。

5 个答案:

答案 0 :(得分:3)

DataNucleus具有可以从java或命令行调用的SchemaTool。它可以满足您的需求

- 安迪(DataNucleus

答案 1 :(得分:2)

将数据从数据库导出为sql

使用liquibase开源项目

  

LiquiBase是一个开源(LGPL),独立于数据库的库,用于跟踪,管理和应用数据库更改。它建立在一个简单的前提上:所有数据库更改(结构和数据)都以基于XML的描述方式存储,并检入源代码控制。

为给定的JPA实体生成创建和删除脚本

我们使用此代码生成drop和create语句: 只需使用所有实体类构造此类并调用create / dropTableScript。

如果需要,您可以使用persitence.xml和persitance单元名称。随便说点 我也发布了这段代码。

import java.util.Collection;
import java.util.Properties;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.dialect.Dialect;
import org.hibernate.ejb.Ejb3Configuration;

/**
 * SQL Creator for Tables according to JPA/Hibernate annotations.
 *
 * Use:
 *
 * {@link #createTablesScript()} To create the table creationg script
 *
 * {@link #dropTablesScript()} to create the table destruction script
 * 
 */
public class SqlTableCreator {

    private final AnnotationConfiguration hibernateConfiguration;
    private final Properties dialectProps;

    public SqlTableCreator(final Collection> entities) {

        final Ejb3Configuration ejb3Configuration = new Ejb3Configuration();
        for (final Class entity : entities) {
            ejb3Configuration.addAnnotatedClass(entity);
        }

        dialectProps = new Properties();
        dialectProps.put("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect");

        hibernateConfiguration = ejb3Configuration.getHibernateConfiguration();
    }

    /**
     * Create the SQL script to create all tables.
     * 
     * @return A {@link String} representing the SQL script.
     */
    public String createTablesScript() {
        final StringBuilder script = new StringBuilder();

        final String[] creationScript = hibernateConfiguration.generateSchemaCreationScript(Dialect
                .getDialect(dialectProps));
        for (final String string : creationScript) {
            script.append(string).append(";\n");
        }
        script.append("\ngo\n\n");

        return script.toString();
    }

    /**
     * Create the SQL script to drop all tables.
     * 
     * @return A {@link String} representing the SQL script.
     */
    public String dropTablesScript() {
        final StringBuilder script = new StringBuilder();

        final String[] creationScript = hibernateConfiguration.generateDropSchemaScript(Dialect
                .getDialect(dialectProps));
        for (final String string : creationScript) {
            script.append(string).append(";\n");
        }
        script.append("\ngo\n\n");

        return script.toString();
    }
}

答案 2 :(得分:2)

Hibernate内置了对此的支持。请参阅 org.hibernate.tool.hbm2ddl.SchemaExport

答案 3 :(得分:2)

OpenJPA也支持这一点。 OpenJPA mapping tool可以创建脚本或创建ddl文件。 ddl应该与其他JPA实现一起使用(尽管每个供应商都有一些怪癖)。

如果您使用OpenJPA作为持久性提供程序,则可以通过将SynchronizeMappings属性添加到persistence.xml来配置OpenJPA,以便在第一次需要时创建表。

示例:

<persistence-unit name="test"> 
    <!--
       . . .
      -->
    <properties>
        <property name="openjpa.jdbc.SynchronizeMappings"
                  value="buildSchema"/>
    </properties>
    <!--
       . . .
      -->
</persistence-unit>

答案 4 :(得分:1)

这里有一个关于如何使用hibernate SchemaExport类来完成你想要的内容的解释。

http://jandrewthompson.blogspot.com/2009/10/how-to-generate-ddl-scripts-from.html

希望这有帮助。