通过将Spring Jpa与Hibernate结合使用来创建架构(如果不存在)

时间:2019-01-23 22:13:47

标签: java postgresql hibernate spring-boot spring-data-jpa

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

我成功了,我将hibernate.hbm2ddl.auto用作update,因此它正在创建表(如果不存在),但是唯一的问题是当模式不存在时会抛出异常< / p>

错误

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

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

配置类

@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

2 个答案:

答案 0 :(得分:1)

如果不存在,添加此属性将有效并创建模式here

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

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

答案 1 :(得分:0)

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

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

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

Spring Docs

<块引用>

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

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