47

JPA (Hibernate の実装) を使用してエンティティ クラスに注釈を付け、リレーショナル データベース (MySQL または SQL Server) に永続化します。注釈付きクラスからデータベース スキーマ (テーブル作成スクリプト) を自動生成する簡単な方法はありますか?

私はまだプロトタイピング段階にあり、頻繁なスキーマの変更が予想されます。注釈付きのコードからデータモデルを指定して変更できるようにしたいと考えています。Grails は、ドメイン クラスからデータベースを生成するという点で似ています。

4

9 に答える 9

14

Hibernate からhbm2ddlを使用できます。ドキュメントはこちらです。

于 2008-11-18T00:20:23.277 に答える
13

特定の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<Class<?>> 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();
    }
}
于 2009-07-01T08:39:09.493 に答える
10

Hibernate 4.3+ は JPA 2.1 を実装するようになったため、DDL スクリプトを生成する適切な方法は、次の JPA 2.1 プロパティのセットを使用することです。

<property name="javax.persistence.schema-generation.scripts.action" value="create"/>
<property name="javax.persistence.schema-generation.create-source" value="metadata"/>
<property name="javax.persistence.schema-generation.scripts.create-target" value="target/jpa/sql/create-schema.sql"/>

実行時に実行されるため、ビルド時にこの DDL 生成を実行することをお勧めします。 おそらく Hibernate チームが Gradle に移行したため、Hibernate4 でサポートされている公式の Maven プラグインはもうありません。

とにかく、これはこのスクリプトをプログラムで生成する JPA 2.1 アプローチです。

import java.io.IOException;
import java.util.Properties;

import javax.persistence.Persistence;

import org.hibernate.jpa.AvailableSettings;

public class JpaSchemaExport {

    public static void main(String[] args) throws IOException {
        execute(args[0], args[1]);
        System.exit(0);
    }

    public static void execute(String persistenceUnitName, String destination) {
        System.out.println("Generating DDL create script to : " + destination);

        final Properties persistenceProperties = new Properties();

        // XXX force persistence properties : remove database target
        persistenceProperties.setProperty(org.hibernate.cfg.AvailableSettings.HBM2DDL_AUTO, "");
        persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_DATABASE_ACTION, "none");

        // XXX force persistence properties : define create script target from metadata to destination
        // persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_CREATE_SCHEMAS, "true");
        persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_SCRIPTS_ACTION, "create");
        persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_CREATE_SOURCE, "metadata");
        persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_SCRIPTS_CREATE_TARGET, destination);

        Persistence.generateSchema(persistenceUnitName, persistenceProperties);
    }

}

ご覧のとおり、とてもシンプルです。

AntTask、または次のような MAVEN ビルド (MAVEN の場合) でこれを使用できるようになりました。

            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <id>generate-ddl-create</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <!-- ANT Task definition -->
                                <java classname="com.orange.tools.jpa.JpaSchemaExport"
                                    fork="true" failonerror="true">
                                    <arg value="${persistenceUnitName}" />
                                    <arg value="target/jpa/sql/schema-create.sql" />
                                    <!-- reference to the passed-in classpath reference -->
                                    <classpath refid="maven.compile.classpath" />
                                </java>
                            </target>
                        </configuration>

                    </execution>
                </executions>
            </plugin>
于 2014-12-05T10:22:41.877 に答える
9

関連する注記: EclipseLink JPA を使用してデータベース スキーマを生成するためのドキュメントは、ここにあります。

于 2008-12-04T19:33:02.460 に答える
6

これは、休止状態の SchemaExport クラスを使用して、まさに必要なことを行う方法の説明です。

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

于 2009-10-28T15:08:45.937 に答える
2

Spring で構成することを好む場合は、これが役立つはずです。

 <!-- CONTAINER-MANAGED JPA Entity manager factory (No need for persistence.xml)-->
    <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
    <!-- Fine Grained JPA properties Create-Drop Records -->
    <property name="jpaProperties">
    <props>
    <prop key="hibernate.hbm2ddl.auto">create</prop>
    </props>
    </property> 
    </bean> 
     <!-- The JPA vendor -->
    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <!-- <property name="database" value="MySQL"/> -->
    <property name="showSql" value="true"/>
    <!--  <property name="generateDdl" value="true"/>  -->
    <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>      
    </bean> 
     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="emf" />
     </bean>
于 2012-10-19T08:36:27.120 に答える
2

これを実現するには、maven プラグインを使用できます。

       <plugin>
            <!-- run command "mvn hibernate3:hbm2ddl" to generate DLL -->
            <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>
于 2013-08-27T12:25:50.357 に答える
1
<property name="hibernate.hbm2ddl.auto" value="update"/>

上記のコードを persistence.xml の properties タグの下に追加します。「更新」は、コードを初めて実行したときにテーブルを作成し、その後、ドメインオブジェクトに変更があった場合にのみテーブル構造を更新します。

于 2013-08-30T04:28:15.240 に答える