J'ai une application de démarrage de printemps avec des données de printemps et une veille prolongée pour enregistrer les données dans la base de données MySQL. J'ai une table d'utilisateurs et une table d'adresses avec une relation de trop. Lorsque j'enregistre les données, la clé primaire générée automatiquement est générée correctement, mais lorsque je mets à jour la table d'adresses (ajoute une deuxième adresse à l'utilisateur), la clé primaire générée pour le deuxième utilisateur n'est pas consécutive.

Ce sont mes entités.

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_generator")
    @SequenceGenerator(name="user_generator", sequenceName = "user_seq")
    @Column(name = "user_id")
    private Long id;
    @Unique
    @Column(nullable = false)
    private String username;
    @Column(nullable = false)
    private String firstname;
    @Column(nullable = false)
    private String lastname;
    private String password;

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Address> address;
    private Boolean active;
    private String mobile;
    private String home;

    public User() {
    }
@Entity
@Table(name = "address")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "address_generator")
    @SequenceGenerator(name = "address_generator", sequenceName = "address_seq")
    @Column(name = "adress_id")
    private Long id;
    @Column(nullable = false)
    private String street1;
    private String street2;
    @Column(nullable = false)
    private String city;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

C'est la méthode de mise à jour

   @Override
    public UserDTO updateUser(UserDTO userDto) {

          User user = userMapper.getUserEntity(userDto);
          user.getAddress().forEach(a->a.setUser(user));
          User updatedUser = userRepository.save(user);
          return userMapper.getUserDTO(updatedUser);
    }


C'est ma charge utile. L'adresse avec id=2 est déjà enregistrée et j'ajoute une deuxième adresse.

    {
        "id": 2,
        "username": "test@gmail.com",
        "firstname": "lana",
        "lastname": "Lee",
        "address": [
            {
                "id": 2,
                "street1": "344",
                "street2": "abcd",
                "city": "mycity"
            },
            {
                 "street1": "7",
                "street2": "cde",
                "city": "mycity"
            }
        ],
        "active": false,
        "mobile": "1232211441"
    }

Lorsque je mets à jour le, voici à quoi ressemble la colonne id de la table d'adresses. L'adresse de la nouvelle adresse ajoutée est 52 au lieu de 5.

0
UserR 22 févr. 2020 à 11:34

1 réponse

Meilleure réponse

Vous devez modifier la taille d'allocation par défaut qui selon le SequenceGenerator Javadoc est défini comme :

allocationTaille

public abstract int allocationSize (facultatif)

montant à incrémenter lors de l'attribution des numéros de séquence à partir de la séquence.

Par défaut : 50

Essayez de le régler sur 1 ou sur ce qui convient à vos besoins.

0
Community 20 juin 2020 à 09:12