Я не могу сгенерировать автоинкрементный Id, а hibernate всегда генерирует 1 как Id

0

Я немного смущен этим, и я прошу помощи только для того, чтобы понять, что происходит.

Итак, у меня есть эта таблица (DDL):

CREATE TABLE 'users' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'firstname' varchar(45) NOT NULL,
  'lastname' varchar(45) NOT NULL,
  'email' varchar(60) NOT NULL,
  'password' varchar(100) NOT NULL,
  'enabled' tinyint(1) NOT NULL,
  'created_at' datetime DEFAULT NULL,
  'image_id' int(11) NOT NULL,
  PRIMARY KEY ('id'),
  UNIQUE KEY 'email_UNIQUE' ('email'),
  KEY 'FK17herqt2to4hyl5q5r5ogbxk9' ('image_id'),
  CONSTRAINT 'FK17herqt2to4hyl5q5r5ogbxk9' FOREIGN KEY ('image_id') REFERENCES    'images' ('id'),
CONSTRAINT 'fk_users_images1' FOREIGN KEY ('image_id') REFERENCES 'images' ('id') ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

И мое лицо:

@Entity
@Table(name = "users")
public class User implements Serializable {

    private static final long serialVersionUID = 6304869652591140818L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;

    @Column(name = "firstname")
    private String firstname;

    @Column(name = "lastname")
    private String lastname;

    @Column(name = "email")
    private String email;

    @Column(name = "password")
    @Transient
    private String password;

   @Column(name = "enabled")
   private int enabled;

   @Column(name = "created_at")
   private LocalDateTime createdAt;

   @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   @JoinTable(name = "users_has_roles",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id"))
   private Set<Role> roles;

   @MapsId
   @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   private Image image;

   // Setters and Getters
}

Я пытаюсь сохранить нового пользователя с помощью этого кода:

@PersistenceContext
private EntityManager em;

@Transactional
public void createUser(NewUserDto newUser) {

    User user = new User();
    user.setFirstname(newUser.getFirstname());
    user.setLastname(newUser.getLastname());
    user.setEmail(newUser.getEmail());
    user.setEnabled(ENABLED);
    user.setPassword(bCryptPasswordEncoder.encode(newUser.getPassword()));

    Image userImage = imageService.getImageById(1L);
    user.setProfileImage(userImage);


    Set<Role> roles = new HashSet<Role>();

    Role role = roleRepository.findByName(newUser.getRole());
    roles.add(role);

    user.setRoles(roles);

    if (user.getId() == null) {
        em.persist(user);
        em.flush();
    } else {
        em.merge(user);
    }

}

Дело в том, что когда я отлаживаю, я вижу, что всегда генерирует id = 1 для нового пользователя.

Но в базе данных я вижу все правильно.

Изображение 174551

И когда я ищу всех пользователей, я получаю следующее:

public List<User> getAll() {
    return userRepository.findAll();
}

Изображение 174551

Аналогичная функция JPDA ObjectReference.

Любая помощь будет приветствоваться.

Благодарю.

Теги:
spring-boot
spring
hibernate
spring-data

2 ответа

1

Проблема связана с недоразумением, когда Hibernate fallback для GenerationType.AUTO - GenerationType.SEQUENCE, в то время как большинству людей требуется GenerationType.IDENTITY, поэтому вы можете использовать идентификатор, который вам присваивает база данных. просто измените стратегию на IDENTITY и ваша проблема решена.

1

(Извинения за то, что у вас недостаточно репутации, чтобы оставить комментарий)

Я не понимаю ваш вопрос. В любом случае я попытаюсь объяснить, исходя из того, что, по вашему мнению, является вашей проблемой.

  • По умолчанию начальное значение для AUTO_INCREMENT равно 1, и оно будет увеличиваться на 1 для каждой новой записи. Так что ожидается поведение.
  • Если вы хотите, чтобы он начинался со значения, которое не равно 1, вы должны использовать GenerationType.SEQUENCE с соответствующими изменениями.
  • Image1: Вы упомянули, что значения вводятся в базу данных правильно, и это показывает, что значения Id генерируются правильно
  • Image2: пользователи представляют собой массив Javascript. Значения индексов массивов javascript всегда начинаются с нуля. Это просто значение индекса, а НЕ значение id. Аналогично, идентификатор, указанный справа, - это идентификатор внутреннего объекта javascript, а не фактический идентификатор вашего пользователя.
  • Чтобы увидеть реальный идентификатор пользователя, разверните пользователя в позиции 0.

Если это не отвечает на ваши вопросы, любезно уточните свой вопрос и какова именно ошибка или проблема.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню