Auto generate data schema from JPA 2.1 annotated entity classes without a database connection

后端 未结 3 1442
清酒与你
清酒与你 2021-01-17 01:09

Two years ago I was working on a project using:

  • spring 4.0.3.RELEASE
  • jpa 2.0
  • hibernate 4.2.7.Final
  • java 1.6.X

This pr

3条回答
  •  佛祖请我去吃肉
    2021-01-17 01:42

    I follow your idea of using h2 with Mysql dialect but using JPA Persistence.generateSchema(...).

    It does work except all commands are not separated by a semi-column...

    How can this been done using JPA 2.1?

    Otherwise I will switch to your solution.

    import java.util.Properties;
    
    import javax.persistence.Persistence;
    import javax.persistence.PersistenceException;
    
    import org.hibernate.jpa.AvailableSettings;
    
    /**
     * Generate DDL with hibernate 4+/5:
     * http://stackoverflow.com/questions/27314165/generate-ddl-script-at-maven-build-with-hibernate4-jpa-2-1/27314166#27314166
     * @author dmary
     * 
     */
    public class Jpa21SchemaExport {
    
        /**
         * 
         */
        public Jpa21SchemaExport() {
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            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);
    
            persistenceProperties.setProperty(AvailableSettings.JDBC_DRIVER,"org.h2.Driver");
            persistenceProperties.setProperty(AvailableSettings.JDBC_URL, "jdbc:h2:mem:export");
            persistenceProperties.setProperty(AvailableSettings.JDBC_USER, "sa");
            persistenceProperties.setProperty(AvailableSettings.JDBC_PASSWORD, "");
    
            persistenceProperties.setProperty(org.hibernate.cfg.AvailableSettings.DIALECT, "com.wiztivi.sdk.persistence.MySQL5InnoDBUTF8Dialect");
    
            try
            {
                Persistence.generateSchema(persistenceUnitName, persistenceProperties);
            } catch (PersistenceException pe)
            {
                System.err.println("DDL generation failed: ");
                pe.printStackTrace(System.err); 
            }
        }
    

提交回复
热议问题