Configuration.generateSchemaCreationScript()在Hibernate 5中的位置

Luk*_*der 28 java configuration jpa hbm2ddl hibernate-5.x

在Hibernate 4.x中,我曾经生成并导出了注释实体中定义的模式,如下所示(使用Spring在类路径上查找带注释的实体):

Connection connection = 
    DriverManager.getConnection("jdbc:h2:mem:jooq-meta-extensions", "sa", "");

Configuration configuration = new Configuration()
    .setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");

// [...] adding annotated classes to Configuration here...

configuration.generateSchemaCreationScript(
    Dialect.getDialect(configuration.getProperties()));
SchemaExport export = new SchemaExport(configuration, connection);
export.create(true, true);
Run Code Online (Sandbox Code Playgroud)

这在Hibernate 5.0中不再有效:

除了以下内容之外,我没有在迁移指南中找到任何明显的引用变化:

从配置中删除了相当多的方法

基于一组带注释的实体,使用Hibernate 5.0在现有JDBC连接上生成和导出数据库的正确方法是什么?(基于JPA的纯解决方案也很好)

(注意,只是删除呼叫generateSchemaCreationScript()似乎工作,但我宁愿确保这是正确的)

Luk*_*der 27

感谢VladGunnar的回答,我已经设法通过新的配置API找到了我的方法来生成具有以下内容的等效导出逻辑.当然,历史记录显示此API将再次中断,因此请务必选择合适的版本:

Hibernate 5.2:

MetadataSources metadata = new MetadataSources(
    new StandardServiceRegistryBuilder()
        .applySetting("hibernate.dialect", "org.hibernate.dialect.H2Dialect")
        .applySetting("javax.persistence.schema-generation-connection", connection)
        .build());

// [...] adding annotated classes to metadata here...
metadata.addAnnotatedClass(...);

SchemaExport export = new SchemaExport();
export.create(EnumSet.of(TargetType.DATABASE), metadata.buildMetadata());
Run Code Online (Sandbox Code Playgroud)

Hibernate 5.2(没有警告):

以上将产生一些令人讨厌的警告,可以忽略:

Okt 20,2016 2:57:16 PM org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator initiateService
WARN:HHH000181:没有遇到合适的连接提供商,假设应用程序将提供连接
Okt 20,2016 2:57:16 PM org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator initiateService
WARN:HHH000342:无法获取与查询元数据的连接:应用程序必须提供JDBC连接

...或者你通过ConnectionProvider在设置中黑客攻击来解决这些问题(在我看来不应该要求)

        .applySetting(AvailableSettings.CONNECTION_PROVIDER, new ConnectionProvider() {
            @Override
            public boolean isUnwrappableAs(Class unwrapType) {
                return false;
            }
            @Override
            public <T> T unwrap(Class<T> unwrapType) {
                return null;
            }
            @Override
            public Connection getConnection() {
                return connection; // Interesting part here
            }
            @Override
            public void closeConnection(Connection conn) throws SQLException {}

            @Override
            public boolean supportsAggressiveRelease() {
                return true;
            }
        })
Run Code Online (Sandbox Code Playgroud)

Hibernate 5.0:

MetadataSources metadata = new MetadataSources(
    new StandardServiceRegistryBuilder()
        .applySetting("hibernate.dialect", "org.hibernate.dialect.H2Dialect")
        .build());

// [...] adding annotated classes to metadata here...
metadata.addAnnotatedClass(...);

SchemaExport export = new SchemaExport(
    (MetadataImplementor) metadata.buildMetadata(),
    connection // pre-configured Connection here
);
export.create(true, true);
Run Code Online (Sandbox Code Playgroud)

Hibernate 4:

提醒一下,这是在Hibernate 4中如何工作的:

Configuration configuration = new Configuration()
    .setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");

// [...] adding annotated classes to metadata here...
configuration.addAnnotatedClass(...);

configuration.generateSchemaCreationScript(
    Dialect.getDialect(configuration.getProperties()));
SchemaExport export = new SchemaExport(configuration, connection);
export.create(true, true);
Run Code Online (Sandbox Code Playgroud)

  • 为什么休眠需要连接?在测试设置中,根据已知的良好版本检查生成的模式时不需要它。 (2认同)