A partir de ahora estoy generando una identificación usando
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;la secuencia generada en DB es como:
CREATE SEQUENCE public.table_name_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; ALTER SEQUENCE public.table_name_id_seq OWNED BY public.table_name.id; ALTER TABLE ONLY public.table_name ALTER COLUMN id SET DEFAULT``nextval('public.table_name_id_seq'::regclass);o en algunos lugares en la definición misma:
CREATE TABLE "public.table_name" ( "id" int8 NOT NULL DEFAULT nextval('table_name_id_seq'::regclass), "some_column" varchar(255), PRIMARY KEY ("id") ); Estoy usando hibernate como proveedor de JPA, necesitaba habilitar el procesamiento por lotes de inserción y actualización, por lo que quiero cambiar el tipo de generación a SEQUENCE desde IDENTITY .
Después de cambiar a la secuencia de tipo de generación [en hibernación] y usar una secuencia anterior [de postgres], veo que se genera una identificación extraña. Este no es el comportamiento esperado.
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "table_name_id_seq ") private Long id;Los ID que están resaltados en amarillo se crean después de usar la secuencia de tipo de generación. Esperaba que la identificación después de 23 fuera 24 y no -22.
¿Cómo puedo arreglar esto? ¿Cómo puedo cambiar sin problemas de IDENTIDAD a SECUENCIA? ¿Cuál es el DDL adecuado?
Respondiendo a esta parte de tu pregunta:
¿Cómo puedo cambiar sin problemas de
IDENTITYaSEQUENCE? ¿Cuál es el DDL adecuado?
Debes hacer lo siguiente:
table_name.id : alter table only table_name alter column id drop default;id : @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_generator") @SequenceGenerator(name = "my_generator", sequenceName = "table_name_id_seq", allocationSize = 1) private Long id; Tenga en cuenta que un tamaño de allocationSize debe ser igual al INCREMENT BY de su definición de secuencia.