postgresql 如何在Postgres中对分区表使用hibernate验证?

yacmzcpb  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(110)

我用下面的代码创建了一个表:

CREATE TABLE my_table(
    id BIGSERIAL,
    PRIMARY KEY(id)
) PARTITION BY RANGE (id);

CREATE TABLE my_table_2023_10 PARTITION OF my_table FOR VALUES FROM (1) to (100000);

字符串
application.yml:

server:
  port: ${SERVER_PORT:12332}
spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/pg_test
    username: postgres
    password: 12345
    driverClassName: org.postgresql.Driver
  jpa:
    database-platform: org.hibernate.dialect.PostgreSQLDialect
    hibernate.ddl-auto: validate


实体

@Entity(name = "my_table")
@Data
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}


build.gradle:

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.12'
    id 'io.spring.dependency-management' version '1.1.0'
}

group = 'com.spring.playground'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.springdoc:springdoc-openapi-ui:1.6.11'
    implementation 'org.postgresql:postgresql:42.6.0'
    implementation 'org.mapstruct:mapstruct:1.5.5.Final'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
}


当我启动我的应用程序时,我得到以下异常:由以下原因引起:javax.persistence.PersistenceException:[PersistenceUnit:default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException:Schema-validation:missing table [my_table]
如果我将hibernate.ddl-auto:validate替换为hibernate.ddl-auto:none,则可以正常工作
使用ddl-auto:none,hibernate可以很好地执行插入和更新。
类似的问题:JPA Hibernate Mapping Partitioned Table to an Entity
但它没有答案。

9ceoxa92

9ceoxa921#

为了解决这个问题,你必须改变一点Entity Class

@Entity
@Table(name = "my_table")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyEntity {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
}

字符串
@Table注解允许您指定将用于在数据库中持久化实体的表的详细信息。@Table注解提供了四个属性,允许您覆盖表的名称、其目录和其架构,并对表中的列强制唯一约束。
在您的情况下,这就是原因,因为MyEntity不是数据库中的表名。

更新

为fix
你必须在配置文件中添加下一个参数

hibernate.hbm2ddl.extra_physical_table_types=PARTITIONED TABLE

相关问题