两年前,我正在使用以下项目进行开发:
这个项目有一个maven任务hibernate3-maven-plugin,它使我们能够生成数据库模式而无需与数据库(MySQL)进行任何连接。
现在,我们通过以下方式升级该项目:
我知道hibernate3-maven-plugin在JPA 2.1和hibernate> 4.3上不起作用。
我找到的所有解决方案都需要连接到数据库。
有谁知道如何离线生成数据库架构?我所拥有的只是一个persistence.xml,其中列出了所有实体类。
我能够将您的Hibernate解决方案与JPA2.1混合使用:
现在,我可以从persistence.xml添加实体类
这样,我可以在实体所在的jar外部生成SQl文件。
这是一个临时解决方案,直到休眠修复此错误为止
谢谢你的帮助。
/** * */ package com.stackoverflow.common.util.schema; import java.io.IOException; import java.util.Properties; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.metamodel.ManagedType; import javax.persistence.metamodel.Metamodel; import org.hibernate.boot.MetadataBuilder; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.BootstrapServiceRegistry; import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.cfg.Environment; import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; import org.hibernate.jpa.AvailableSettings; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.dialect.MySQL5InnoDBDialect; /** * */ public class JPA21Hibernate5ExportSchema { private static final String JDBC_DRIVER = "org.h2.Driver"; private static final String JDBC_URL = "jdbc:h2:mem:export;DB_CLOSE_DELAY=-1"; private static final String JDBC_USERNAME = "sa"; private static final String JDBC_PASSWORD = ""; /** * */ public JPA21Hibernate5ExportSchema() { } public static void main(String[] args) { try { JPA21Hibernate5ExportSchema hes = new JPA21Hibernate5ExportSchema(); hes.export(args[0], args[1]); System.exit(0); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } public void export(String persistenceUnitName, String sqlFile) throws IOException, ClassNotFoundException { final BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder().build(); final MetadataSources metadataSources = new MetadataSources(bsr); final StandardServiceRegistryBuilder srrBuilder = new StandardServiceRegistryBuilder(bsr) .applySetting(Environment.CONNECTION_PROVIDER, DriverManagerConnectionProviderImpl.class.getName()) .applySetting(Environment.DIALECT, MySQL5InnoDBDialect.class.getName()) .applySetting(Environment.URL, JDBC_URL).applySetting(Environment.USER, JDBC_USERNAME) .applySetting(Environment.PASS, JDBC_PASSWORD); // Use the persistence metamodel to retrieve the Entities classes Metamodel metamodel = this.getMetamodel(persistenceUnitName); for (final ManagedType<?> managedType : metamodel.getManagedTypes()) { metadataSources.addAnnotatedClass(managedType.getJavaType()); } final StandardServiceRegistry ssr = (StandardServiceRegistry) srrBuilder.build(); final MetadataBuilder metadataBuilder = metadataSources.getMetadataBuilder(ssr); final SchemaExport exporter = new SchemaExport((MetadataImplementor) metadataBuilder.build()); exporter.setOutputFile(sqlFile); exporter.setDelimiter(";"); exporter.setFormat(true); exporter.create(false, true); } /** * Retrieve the JPA metamodel from the persistence unit name * * @param persistenceUnitName * @return */ private Metamodel getMetamodel(String persistenceUnitName) { final Properties persistenceProperties = new Properties(); persistenceProperties.setProperty(AvailableSettings.JDBC_DRIVER, JDBC_DRIVER); persistenceProperties.setProperty(AvailableSettings.JDBC_URL, JDBC_URL); persistenceProperties.setProperty(AvailableSettings.JDBC_USER, "sa"); persistenceProperties.setProperty(AvailableSettings.JDBC_PASSWORD, ""); persistenceProperties.setProperty(org.hibernate.cfg.AvailableSettings.DIALECT, MySQL5InnoDBDialect.class.getName()); final EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnitName, persistenceProperties); return emf.getMetamodel(); } }