代码之家  ›  专栏  ›  技术社区  ›  Ryuzaki L

使用SpringJPA和Hibernate创建不存在的架构

  •  2
  • Ryuzaki L  · 技术社区  · 5 年前

    我正在开发SpringBoot2应用程序,并尝试通过配置hikari数据源和SpringJPA与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
    

    我通过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

    1 回复  |  直到 5 年前
        1
  •  1
  •   Ryuzaki L    5 年前

    如果不存在,则添加此属性已工作并已创建架构 here

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

    hibernate.hbm2dll.create_名称空间的jpa变体。指定持久性提供程序是否要创建数据库架构以及创建数据库对象(表、序列、约束等)。如果持久性提供程序要在数据库中创建架构或生成包含“create schema”命令的DDL,则此布尔属性的值应设置为true。如果未提供此属性(或显式为假),则提供程序不应尝试创建数据库架构。