2014-12-05 6 views
8

Es scheint, als ob die hibernate3-maven-plugin, die zum Generieren von DDL create/drop Skripten verwendet wird, nicht mehr kompatibel mit und neueren Versionen (mit JPA 2.1).Generieren DDL-Skript bei MAVEN mit Hibernate4/JPA 2.1

Ich benutze dieses Plugin-Konfiguration:

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

Aber ich erhalte den folgenden Fehler:

[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] 

Diese Klasse als auf ein neues Paket migriert: org.hibernate.internal.util.ReflectHelper

aber ich fand keine klare Möglichkeit, DDL-Create-Skripte bei MAVEN Build zu erstellen.

Es gibt keine hibernate4-maven-plugin, oder eine andere offizielle Art, es zu tun.

Also was? Ist es nicht ein Hauptmerkmal, das unterstützt werden sollte? Wie es geht ?

+2

Wie wäre es mit [Hibernate-Maven-Plugin 4.3.1 Final] (http://mvnrepository.com/artifact/org.hibernate/hibernate-maven-plugin/4.3.1.Final)? – wypieprz

Antwort

20

Als Hibernate 4.3+ implementiert jetzt JPA 2.1 die geeignete Art und Weise DDL-Skripte zu erzeugen, ist folgenden Satz von JPA 2.1 Eigenschaften verwenden:

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

Eine schöne Zusammenfassung von anderen Eigenschaften und Kontext der Schemagenerierung in JPA 2.1 gefunden werden kann hier: https://blogs.oracle.com/arungupta/entry/jpa_2_1_schema_generation

Und offiziellen JPA 2.1 Spezifikationen hier: https://jcp.org/aboutJava/communityprocess/final/jsr338/index.html

Da dies zur Laufzeit generiert wird, möchten Sie möglicherweise diese DDL-Generierung bei Build ausführen.

Hier ist die JPA 2.1 Ansatz, um dieses Skript zu generieren programmatisch:

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); 
    } 

} 

Wie Sie es ist sehr einfach zu sehen!

Jetzt können Sie diese in einem AntTask verwenden oder MAVEN wie diese bauen (für 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> 

Beachten Sie, dass die offizielle hibernate-maven-plugin auch kann oder auch nicht, in irgendeiner Weise den Trick:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-maven-plugin</artifactId> 
    <version>4.3.1.Final</version> 
</dependency> 

Genießen Sie! :)

+0

bei weitem und groß, beste Lösung, die ich auf diesem gefunden habe ... – ruckc

+0

danke @ruckc aber hast du versucht, das http: // mvnrepository.com/artefact/org.hibernate/hibernate-maven-plugin/4.3.1.Final wie wypieprz sagte? – Donatello

+0

Hallo. Ich habe Ihre Lösung mit Gradle und keine persistence.xml-Datei ausprobiert und ich habe Probleme. Ich habe einen separaten Beitrag geöffnet: http://stackoverflow.com/questions/30225183. Kann mir bitte jemand helfen? – balteo

Verwandte Themen