当前位置: 首页 > 知识库问答 >
问题:

如果不存在,则使用带有Hibernate的Spring Jpa创建模式

单昊穹
2023-03-14

我正在研究springboot2应用程序,并试图通过配置hikari数据源和springJpa来建立与postgresql数据库的连接。

我成功了,我正在使用hibernate.hbm2ddl.auto作为更新,因此如果不存在,它将创建表,但唯一的问题是当架构不存在时它会引发异常

错误

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

如果不存在,我该如何创建架构?

我在这里看到了一个类似的问题,并尝试了所有迄今为止没有运气的类似问题(我不想使用flyway db)

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

共有3个答案

万俟华辉
2023-03-14

这就是在 Springboot 2.6.2 上为 Postgres 工作的原因。

如果模式(adapterborder)不存在,它将创建该模式,并在创建所有实体表时将其用作default_schema。

启用日志跟踪,看看它是如何工作的。

spring:
  jpa:
    open-in-view: false
    generate-ddl: true
    properties:
      javax:
        persistence:
          schema-generation:
            database:
              action: create
      hibernate:
        show_sql: true
        use_sql_comments: true
        format_sql: true
        generate_statistics: false
        jdbc:
          fetch_size: 2000
          lob.non_contextual_creation: true
        dialect: org.hibernate.dialect.PostgreSQLDialect
        ddl-auto: create
        hbm2dll:
          create_namespaces: true
        default_schema: adapterborder

  datasource:
    url: jdbc:postgresql://localhost:5432/postgres?currentSchema=adapterborder
    username: postgres
    password: postgres
    driver-class-name: org.postgresql.Driver
    testWhileIdle: true
    hikari:
      minimumIdle: 5
      maximumPoolSize: 20
      idleTimeout: 30000
      poolName: SpringBootJPAHikariCP
      maxLifetime: 200000
      connectionTimeout: 30000
      connection-test-query: SELECT 1

logging:
  level:
    '[org.springframework.data]': TRACE
    '[org.hibernate]': TRACE
    '[javax.persistence]': TRACE
翁俊良
2023-03-14

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

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

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

Spring文档

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

*就我而言,我使用的是MSSQL服务器

邢嘉祯
2023-03-14

如果此处不存在,则添加此属性可以工作并创建架构

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

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

 类似资料:
  • 问题内容: 我很沮丧,我不知道该怎么做。 基本上,我只想创建一个表,但是如果它存在,则需要将其删除并重新创建,而不是将其截断,但是如果不存在,则可以创建它。 有人可以帮忙吗? 谢谢乔治 问题答案: 放在tablename您的发言之前。 该语句将删除该表(如果存在),但如果不存在则不会引发错误。

  • 问题内容: 我正在使用PostgreSQL,并且是SQL的初学者。我正在尝试从查询创建表,并且如果运行: 它工作正常。但是然后如果我添加“如果不存在”并运行: 使用完全相同的查询,我得到: 有什么办法吗? 问题答案: CREATE TABLE AS被认为是与普通CREATE TABLE 分开的语句,并且 直到Postgres版本9.5 (请参阅changelog条目)不支持子句 为止 。(请务必查

  • 问题内容: 创建新表时遇到一些问题。当我使用CREATE TABLE命令时,我的新表将按应有的形式出现,但是当我退出活动时,应用程序崩溃,并且在logcat中得到了一个表已经存在的信息。如果我使用CREATE TABLE IF NOT EXISTS不存在,则不会形成新表,而只是将新的数据行添加到上一个表中,并且不会崩溃。这有什么问题?我想添加没有它的表,让我已经存在,并且我想要添加它而不向其他表添

  • 我在我的Spring启动应用程序中使用嵌入式hsql db,并且仅当db中不存在时才想创建架构。 假设模式名称为XXX, 我有下面的单语句模式hsql。sql文件: 然而,这与下面的堆栈跟踪有关: 实现这一点的正确语法是什么? 谢谢

  • 我是postgreSQL的新手,我正在尝试创建一个模式文件,其中包含创建数据库和所需表所需的所有脚本。我过去为SQl服务器执行此操作的方式是检查数据库是否存在,然后运行必要的脚本。 postgreSQL中的以下脚本引发了一个错误:“无法从函数或多命令字符串执行创建数据库” 我通过导出数据库的备份创建了一个postgres数据库转储文件,但其中包含, 这意味着每次运行模式文件时,数据库都会被删除并重

  • 嗨,我是新来的拉威尔,在理解如何建立人际关系方面有点挣扎。我试图在laravel中创建一个基本的restful api,有3个模型 表迁移: 书籍是主要的表格,作者与书籍有一对多的关系。类别与书籍有多对多的关系,因为一本书可以在多个类别中。 books表有一个author_id字段将其链接到author表。还有一个名为category_books的透视表,它包含category_id和book_i