如果不存在,则通过将 spring Jpa 与 hibernate 一起使用来创建模式

Posted

技术标签:

【中文标题】如果不存在,则通过将 spring Jpa 与 hibernate 一起使用来创建模式【英文标题】:Create schema if does not exist by using spring Jpa with hibernate 【发布时间】:2019-06-17 14:09:54 【问题描述】:

我正在开发 spring boot 2 应用程序并尝试通过配置 hikari 数据源和 spring Jpa 来建立与 postgresql 数据库的连接。

我成功了,我使用hibernate.hbm2ddl.auto 作为update,所以如果不存在,它会创建表,但唯一的问题是它在架构不存在时抛出异常

错误

GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement
Caused by: org.postgresql.util.PSQLException: ERROR: schema "test_schema" does not exist

我通过配置类手动配置了所有内容

配置类

@Bean
@Primary
public HikariDataSource dataSource() 

    HikariConfig config = new HikariConfig();

    config.setJdbcUrl(databaseUrl);
    config.setUsername(username);
    config.setPassword(password);
    config.setDriverClassName(driverClassName);
    config.setConnectionTimeout(connectionTimeout);
    config.setIdleTimeout(idleTimeout);
    config.setMaximumPoolSize(maxpoolSize);
    config.setMaxLifetime(maxLifeTime);
    config.setMinimumIdle(minIdleConnections);
    //config.setPoolName(poolName);

    return new HikariDataSource(config);


@Bean
public Properties additionalProps() 
    Properties jpaProps = new Properties();

    jpaProps.put(hbDialect, "org.hibernate.dialect.PostgreSQLDialect");
    jpaProps.put(autoDDL, "update");
    jpaProps.put(showSql, true);
    jpaProps.put(formatSql, true);

    return jpaProps;


@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() 
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setDataSource(dataSource());
    factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
    factory.setPackagesToScan("com.target.storetaskcount.entity");
    factory.setJpaProperties(additionalProps());
    return factory;


@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory factory) 
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
    return transactionManager;

如果不存在,我该如何创建模式?

我在这里看到了一个类似的问题,到目前为止尝试了一切都没有运气similar-question(我不想使用flyway db)

这里是文档hibernate-doc,但是不清楚如何添加这个属性来创建架构javax.persistence.schema-generation.database.action

【问题讨论】:

【参考方案1】:

如果不存在here,则添加此属性有效并创建架构@

jpaProps.put("javax.persistence.create-database-schemas", true);

hibernate.hbm2dll.create_namespaces 的 JPA 变体。指定除了创建数据库对象(表、序列、约束等)之外,持久性提供程序是否还要创建数据库模式。如果持久性提供程序要在数据库中创建模式或生成包含“CREATE SCHEMA”命令的 DDL,则该布尔属性的值应设置为 true。如果未提供此属性(或明确为 false),则提供者不应尝试创建数据库模式。

【讨论】:

【参考方案2】:

虽然其他答案完全正确,但我正在分享对我有用的方法。将此添加到 application.properties 文件将创建架构(如果不存在)

spring.jpa.properties.hibernate.hbm2dll.create_namespaces=true

这里我们使用带有 Spring JPA 前缀的 Hibernates 原生属性 (spring.jpa.properties.*)。 同样,您可以通过这种方式使用许多其他 Hibernates 原生属性。

Spring Docs

您可以使用 spring.jpa.properties.* 设置它以及其他 Hibernate 原生属性(在将它们添加到实体管理器之前去除前缀)。

*就我而言,我使用的是 MSSQL Server

【讨论】:

以上是关于如果不存在,则通过将 spring Jpa 与 hibernate 一起使用来创建模式的主要内容,如果未能解决你的问题,请参考以下文章

Spring JPA:如何在不丢失数据的情况下进行更新插入

Axon Framework - Spring Boot 集成

spring jpa ManyToMany 理解和使用

使用 Spring Embedded Database 的 JPA 未找到记录

JPA 正在连接到一个不存在的 HSQL 数据库?

学习Spring-Data-Jpa---定义方法查询