使用Hibernate4/JPA 2.1在MAVEN构建中生成DDL脚本 [英] Generate DDL script at MAVEN build with Hibernate4 / JPA 2.1
问题描述
似乎用于生成DDL创建/删除脚本的hibernate3-maven-plugin
与Hibernate 4.3
和更高版本(使用JPA 2.1
)不再兼容.
It seems like the hibernate3-maven-plugin
used to generate DDL create/drop scripts is not compatible any more with Hibernate 4.3
and newer versions (using JPA 2.1
).
我使用此插件配置:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>hibernate3-maven-plugin</artifactId>
<version>3.0</version>
<executions>
<execution>
<id>generate-sql-schema</id>
<phase>process-sources</phase>
<goals>
<goal>hbm2ddl</goal>
</goals>
<configuration>
<hibernatetool>
<jpaconfiguration persistenceunit="${persistenceUnitName}" />
<hbm2ddl update="true" create="true" export="false"
outputfilename="src/main/sql/schema.sql" format="true"
console="true" />
</hibernatetool>
</configuration>
</execution>
</executions>
</plugin>
但是出现以下错误:
[ERROR] Failed to execute goal org.codehaus.mojo:hibernate3-maven-plugin:3.0:hbm2ddl (generate-sql-schema) on project my-project: There was an error creating the AntRun task.
An Ant BuildException has occured: java.lang.NoClassDefFoundError: org/hibernate/util/ReflectHelper: org.hibernate.util.ReflectHelper -> [Help 1]
此类已迁移到新软件包:org.hibernate.internal.util.ReflectHelper
This class as migrated to a new package : org.hibernate.internal.util.ReflectHelper
但是我发现没有明确的方法可以在MAVEN build上继续生成DDL创建脚本.
However i found no clear way to keep generating DDL create scripts at MAVEN build.
没有hibernate4-maven-plugin
或任何其他官方方式来实现.
There is no hibernate4-maven-plugin
, or any other official way to do it.
那又怎样?这不是应该支持的主要功能吗?怎么做?
So what ? Isn't it a main feature that should be supported ? How to do it ?
推荐答案
由于Hibernate 4.3+
现在实现JPA 2.1
,生成DDL脚本的适当方法是使用以下JPA 2.1属性集:
As Hibernate 4.3+
now implements JPA 2.1
the appropriate way to generate DDL scripts is to use following set of JPA 2.1 properties :
<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"/>
可以在以下位置找到有关JPA 2.1中其他属性和模式生成上下文的完整摘要: https://blogs.oracle.com/arungupta/entry/jpa_2_1_schema_generation
A nice summary of others properties and context of schema generation in JPA 2.1 can be found here : https://blogs.oracle.com/arungupta/entry/jpa_2_1_schema_generation
以及此处的官方JPA 2.1规范: https://jcp.org/aboutJava/communityprocess/final/jsr338/index.html
And official JPA 2.1 specifications here : https://jcp.org/aboutJava/communityprocess/final/jsr338/index.html
由于这将在运行时生成,因此您可能想在构建时执行此DDL生成.
As this will be generated at runtime, you may want to execute this DDL generation at build.
以下是通过编程生成此脚本的JPA 2.1方法:
Here is the JPA 2.1 approach to generate this script programmatically :
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);
}
}
如您所见,这非常简单!
As you can see it's very simple !
现在您可以在AntTask中使用它,或者像这样(对于MAVEN)使用MAVEN构建:
Now you can use this in an AntTask, or MAVEN build like this (for 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>
请注意,官方 hibernate-maven-plugin 也可能会或可能不会技巧:
Note that the official hibernate-maven-plugin also may, or may not, do the trick in some way :
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-maven-plugin</artifactId>
<version>4.3.1.Final</version>
</dependency>
享受! :)
这篇关于使用Hibernate4/JPA 2.1在MAVEN构建中生成DDL脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!