Estou trabalhando com tabelas particionadas usando Postgres e Spring Boot, consegui fazer a partição e nos testes que eu fiz o método GET e POST está funcionando do jeito que eu queria, porém gostaria de ajuda para resolver o seguinte erro, que é retornado quando eu inicio a aplicação:
GenerationTarget encountered exception accepting command : Error executing DDL “create table teste (data date not null, id int4 not null, nome varchar(255), primary key (data, id))” via JDBC Statement org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL “create table teste (data date not null, id int4 not null, nome varchar(255), primary key (data, id))” via JDBC Statement at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
O passo a passo do que eu fiz antes do erro aparecer:
Criei o Model principal, que fará referência a tabela particionada:
@Entity
@Table(name = "teste")
@IdClass(TesteId.class)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Teste {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "teste_id_seq")
@SequenceGenerator(name = "teste_id_seq", sequenceName = "teste_id_seq", initialValue = 1, allocationSize = 1)
private int id;
@Id
private LocalDate data;
private String nome;
}
Criei a classe do id composto:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class TesteId implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private LocalDate data;
}
E então iniciei a aplicação, tudo rodou normalmente.
Após isso pausei a aplicação e particionei a tabela ‘teste’ seguindo a documentação do Postgres: PostgreSQL: Documentation: 15: 5.11. Table Partitioning Tópico: 5.11.2.1. Example
E minha tabela ficou da seguinte forma:
CREATE TABLE IF NOT EXISTS public.teste
(
data date NOT NULL,
id integer NOT NULL,
nome character varying(255) COLLATE pg_catalog."default",
CONSTRAINT teste_pkey PRIMARY KEY (data, id)
) PARTITION BY RANGE (data);
Então eu iniciei a aplicação novamente e o seguinte erro foi impresso no log do Spring Boot:
WARN 16668 --- [ main] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget
encountered exception accepting command : Error executing DDL "create table teste (data
date not null, id int4 not null, nome varchar(255), primary key (data, id))" via JDBC
Statement org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL
"create table teste (data date not null, id int4 not null, nome varchar(255), primary
key (data, id))" via JDBC Statement at
org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetTo
Database.java:67) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at
org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigra
tor.java:562) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at
org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigr
ator.java:507) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
Meu application.properties está assim:
spring.datasource.url=jdbc:postgresql://localhost:5432/teste
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.defer-datasource-initialization=true
spring.datasource.driver-class-name=org.postgresql.Driver
Eu sei que alterar o ‘spring.jpa.hibernate.ddl-auto’ para ‘none’ resolveria o problema, porém não é a solução que eu desejo, já que não quero gerenciar manualmente todas as alterações no banco de dados.