当前位置: 首页 > 面试题库 >

Hibernate 5中Configuration.generateSchemaCreationScript()放在哪里

束高雅
2023-03-14
问题内容

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

这在Hibernate 5.0中不再起作用:

  • Configuration.generateSchemaCreationScript() 不复存在
  • SchemaExport(configuration, connection)构造函数现在已不

除以下内容外,我在迁移指南中没有发现任何明显的参考资料:

从配置中删除了很多方法

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

(请注意,仅删除对的调用generateSchemaCreationScript()似乎有效,但我希望确保正确执行此操作)


问题答案:

多亏了Vlad和Gunnar的回答,我设法通过新的配置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());

Hibernate 5.2(无警告):

上面的代码会产生一些讨厌的警告,可以将其忽略:

2016年10月20日,下午2:57:16
org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator
initializeService
警告:HHH000181:未遇到合适的连接提供者,假设应用程序将提供连接
Okt 20,2016 2:57:16 PM
org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator
initializeService警告: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;
            }
        })

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

休眠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);


 类似资料:
  • 问题内容: 我的项目是这样的: 有人可以告诉我将hibernate.cfg.xml放在哪里吗? 因为出现此错误: 问题答案: 配置文件必须位于上。 根据您的项目,这可以通过不同的方式来完成。 对于 Web应用程序WAR 项目(您正在Servlet容器中运行程序):当应用程序在容器中运行时,将其放入将在类路径上可见的文件中起作用。 对于 Maven的 风格的项目(在Servlet容器没有运行该程序)

  • 我想知道什么是最好的地方将一个Spring引导应用程序注册额外的bean。我有一个主类,它用进行了注释,并且在该类中定义的bean被取走。但是当我把这些bean放到另一个类中时,它似乎没有被注册。 在阅读文档时,我想到将隐式搜索其中包含注释的类。 所以我现在的选择是: > 将所有带注释的bean放在我的主类中 有更好的方法吗?

  • 问题内容: 我使用Eclipse(3.4),并且类编译时没有警告或错误。我的项目使用一个外部jar文件。 为了从另一个项目(不在Eclipse中)使用此类时,我需要在哪里放置此外部jar文件? 我可以将jar提取到项目文件夹中,但是感觉不对。 编辑:这个问题不是关于在Eclipse中导入jar,而是在Eclipse之外使用它们。 问题答案: 如果要在Eclipse项目中包含JAR文件,通常可以在项

  • 我刚刚开始阅读JWT,我相信我理解什么是JWT代币。我对会话也相当熟悉。我相信我了解每种方法的优点和缺点。然而,有几个部分我感到困惑。 当请求受保护的资源时,您需要在每次请求时发送jwt,而不是在服务器上存储会话。但是: 1)您如何存储您的JWT令牌以及在哪里。根据我所读到的,我知道您向服务器发送身份验证请求,如果您成功进行身份验证,服务器会向您发送JWT令牌。然后你会怎么做?,你会像我在一些网站

  • 当我们想让logback.xml文件可配置时,将其放在Tomcat中的哪个位置? 以及如何使运行在其中的Java应用程序可以访问它?

  • 问题内容: hibernate注释应该放在哪里? 它是我的实例变量上方的线吗?还是在吸气剂之前?还是在二传手之前?还是真的不重要吗? 非常感谢 问题答案: 您可以将它们放在 野外 或 吸气剂上 。从《 Hibernate注释参考指南》中: 2.2.1。将POJO标记为持久实体 (…) 根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。EJB3规范要求您在将要访问的元素类型上