Je mets à niveau mon projet vers Spring Boot 2.1.18 qui utilise Hibernate 5.3.18.

Auparavant, mon entité ressemblait à ceci et utilisait le 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 
}

Désormais, par défaut dans Hibernate 5, il utilise le SequenceStyleGenerator qui provoque des violations de contraintes car ma taille d'incrément est 1 et l'allocationSize par défaut est 50.

La chose suggérée à faire pour maintenir la compatibilité est de définir cette propriété:

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

Je le fais mais cela ne semble pas prendre, car le SequenceStyleGenerator est toujours utilisé. D'après ce que je comprends, cela devrait l'amener à utiliser le SequenceHiLoGenerator. Est-ce incorrect?

Cependant, si je modifie l'entité pour qu'elle ressemble à celle ci-dessous, cela fonctionne comme prévu, répliquant la fonctionnalité précédente que j'avais.

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

Donc, il semblerait que la propriété ne soit pas prise d'une manière ou d'une autre et je cherche à comprendre pourquoi. Je le vois apparaître dans mon bean JpaProperties. Si je change d'autres propriétés, comme mon dialecte, je vois qu'elles prennent effet.

Quelqu'un pourrait-il m'indiquer le code qui lit réellement cette propriété et prend une décision sur le générateur à utiliser ou signaler une erreur évidente que je fais ici?

1
AHungerArtist 25 févr. 2021 à 22:39

1 réponse

Meilleure réponse

Comme indiqué dans le documentation:

Vous devez vous assurer que les noms définis sous spring.jpa.properties.* correspondent exactement à ceux attendus par votre fournisseur JPA. Spring Boot ne tentera aucun type de liaison détendue pour ces entrées.

Par exemple, si vous souhaitez configurer la taille de lot d'Hibernate, vous devez utiliser spring.jpa.properties.hibernate.jdbc.batch_size. Si vous utilisez d'autres formulaires, tels que batchSize ou batch-size, Hibernate n'appliquera pas le paramètre.

Donc, pour votre cas, vous devez utiliser:

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

Voir aussi cette partie de la mise en veille prolongée Documentation.

1
SternK 27 févr. 2021 à 13:00