2014-12-05 4 views
8

यह hibernate3-maven-plugin DDL उत्पन्न ड्रॉप स्क्रिप्ट बनाने/करने के लिए इस्तेमाल की तरह लगता है Hibernate 4.3 और नए संस्करणों (JPA 2.1 का प्रयोग करके) के साथ किसी भी अधिक संगत नहीं है।उत्पन्न MAVEN पर DDL स्क्रिप्ट Hibernate4/जेपीए के साथ निर्माण 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

हालांकि मैं कोई स्पष्ट पाया एमवीएन बिल्ड में डीडीएल स्क्रिप्ट बनाने के लिए उत्पन्न करने का तरीका।

कोई hibernate4-maven-plugin, या ऐसा करने के लिए कोई अन्य आधिकारिक तरीका नहीं है।

तो क्या? क्या यह एक मुख्य विशेषता नहीं है जिसे समर्थित किया जाना चाहिए? यह कैसे करना है ?

+2

कैसे [हाइबरनेट-मेवेन-प्लगइन 4.3.1 फ़ाइनल] (http://mvnrepository.com/artifact/org.hibernate/hibernate-maven-plugin/4.3.1.Final) के बारे में कैसे? – wypieprz

उत्तर

20

Hibernate 4.3+ के रूप में अब JPA 2.1 लागू करता उपयुक्त तरीका DDL स्क्रिप्ट उत्पन्न करने के लिए किया जाता है जेपीए 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"/> 

दूसरों के गुण और जेपीए 2.1 में स्कीमा पीढ़ी के संदर्भ का एक अच्छा सारांश पाया जा सकता है यहाँ: https://blogs.oracle.com/arungupta/entry/jpa_2_1_schema_generation

और सरकारी जेपीए 2.1 यहाँ विनिर्देशों: https://jcp.org/aboutJava/communityprocess/final/jsr338/index.html

चूंकि यह रनटाइम पर जेनरेट किया जाएगा, तो आप पर इस डीडीएल पीढ़ी को निष्पादित कर सकते हैं।

यहाँ प्रोग्राम के रूप में इस स्क्रिप्ट उत्पन्न करने के लिए जेपीए 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> 

ध्यान दें कि सरकारी hibernate-maven-plugin भी हो सकता है या नहीं हो सकता, चाल किसी तरह से कार्य करें:

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

आनंद लें! :)

+0

दूर और बड़े, सबसे अच्छे समाधान से मैंने पाया है ... – ruckc

+0

धन्यवाद @ruckc लेकिन आपने http: // mvnrepository का प्रयास किया था।com/artifact/org.hibernate/hibernate-maven-plugin/4.3.1. wypieprz के रूप में अंतिम कहा? – Donatello

+0

हाय। मैंने आपके समाधान को gradle और no persistence.xml फ़ाइल के साथ करने का प्रयास किया है और मैं समस्याओं में भाग रहा हूं। मैंने एक अलग पोस्ट खोला है: http://stackoverflow.com/questions/30225183। क्या कोई मदद कर सकता है? – balteo

1

मुझे थोड़ा देर हो सकती है लेकिन एंड्रयू थॉम्पसन के पास एक और समाधान है जिसमें persistence.xml या वास्तविक डेटाबेस शामिल नहीं है हालांकि यह हाइबरनेट के लिए विशिष्ट है।

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

दुख की बात है, यह कोड का एक छोटा सा है, लेकिन इसके बहुत लचीला शामिल है।

संबंधित मुद्दे