Estoy actualizando mi proyecto a Spring Boot 2.1.18 que usa Hibernate 5.3.18.

Anteriormente, mi entidad se veía así y usaría SequenceHiLoGenerator:

@Entity
@Table(name = "group_link")
@SequenceGenerator(name = "group_link_seq", sequenceName = "group_link_seq")
public class GroupLinkEntity extends BaseObject {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "group_link_seq")
    @Column(name = "group_link_id", unique = true, nullable = false)
    private Long id 
}

Ahora, de forma predeterminada en Hibernate 5, usa SequenceStyleGenerator que causa violaciones de restricciones porque mi tamaño de incremento es 1 y el tamaño de asignación predeterminado es 50.

Lo que se sugiere hacer para mantener la compatibilidad es establecer esta propiedad:

spring.jpa.properties.hibernate.use-new-id-generator-mappings: false

Lo hago, pero no parece que sea necesario, porque todavía se usa SequenceStyleGenerator. Según tengo entendido, esto debería hacer que use SequenceHiLoGenerator. ¿Es esto incorrecto?

Sin embargo, si modifico la entidad para que se vea como la siguiente, funciona como se esperaba, replicando la funcionalidad anterior que tenía.

@Entity
@Table(name = "group_link")
@GenericGenerator(
        name = "group_link_seq",
        strategy = "org.hibernate.id.SequenceHiLoGenerator",
                parameters = {
                           @Parameter(name = "sequence_name", value = "group_link_seq"),
                           }
       )
public class GroupLinkEntity extends BaseObject {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "group_link_seq")
    @Column(name = "group_link_id", unique = true, nullable = false)
    private Long id;
    
}

Entonces, parece que la propiedad no está siendo tomada de alguna manera y estoy buscando averiguar por qué. Lo veo aparecer en mi bean JpaProperties. Si cambio otras propiedades, como mi dialecto, puedo ver que están surtiendo efecto.

¿Alguien podría señalarme el código que realmente lee esa propiedad y toma una decisión sobre qué generador usar o señalar algún error obvio que estoy cometiendo aquí?

1
AHungerArtist 25 feb. 2021 a las 22:39

1 respuesta

La mejor respuesta

Como se indica en documentación:

Debe asegurarse de que los nombres definidos en spring.jpa.properties.* coincidan exactamente con los esperados por su proveedor de JPA. Spring Boot no intentará ningún tipo de vinculación relajada para estas entradas.

Por ejemplo, si desea configurar el tamaño de lote de Hibernate, debe usar spring.jpa.properties.hibernate.jdbc.batch_size. Si usa otros formularios, como batchSize o batch-size, Hibernate no aplicará la configuración.

Entonces, para su caso, debe usar:

spring.jpa.properties.hibernate.id.new_generator_mappings: false

Consulte también esta parte de hibernate documentación.

1
SternK 27 feb. 2021 a las 13:00