Последовательность гибернации не генерирует последовательные числа для идентификатора первичного ключа во время обновления - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть приложение весенней загрузки с данными о Spring и гибернацией для сохранения данных в базе данных MySQL У меня есть таблица пользователей и таблица адресов с одним слишком много отношений. Когда я сохраняю данные, автоматически сгенерированный первичный ключ генерируется правильно, но когда я обновляю таблицу адресов (добавляю второй адрес пользователю), первичный ключ, который генерируется для второго пользователя, не является последовательным.

Это мои сущности.

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

Это метод обновления

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


Это моя полезная нагрузка. Адрес с id = 2 уже сохранен, и я добавляю второй адрес.

    {
        "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"
    }

, когда я обновляю это, как выглядит столбец id таблицы адресов. Адрес нового добавленного адреса - 52 вместо 5.

1 Ответ

0 голосов
/ 22 февраля 2020

Вы должны изменить размер выделения по умолчанию, который в соответствии с SequenceGenerator Javado c устанавливается как:

allocSize

publi c abstract int allocSize (Необязательно)

сумма, которую нужно увеличить при выделении порядковых номеров из последовательности.

По умолчанию: 50

Попробуйте установить значение 1 или любое другое, соответствующее вашим потребностям.

...