我无法生成自动递增的Id,而hibernate总是生成1作为Id

问题描述 投票:0回答:2

我对此有点不安,我正在寻求帮助,只是为了了解发生了什么。

所以,我有这个表(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。

但在数据库中,我看到一切都是正确的。

enter image description here

当我搜索所有用户时,我得到以下内容:

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

enter image description here

相同的JPDA ObjectReference。

任何帮助都将受到欢迎。

谢谢。

mysql spring hibernate spring-boot spring-data
2个回答
1
投票

(抱歉没有足够的声誉发表评论)

我不明白你的问题。无论如何,我会尝试根据我认为你的问题来解释。

  • 默认情况下,AUTO_INCREMENT的起始值为1,每个新记录的起始值将增加1。所以这种行为是预期的。
  • 如果您希望它以不是1的值开头,则必须使用GenerationType.SEQUENCE并进行适当的更改。
  • Image1:您已经提到正确地将值输入到数据库中,这表明正在正确生成Id值
  • Image2:users是一个Javascript数组。 javascript数组的索引值始终从零开始。这只是索引值而不是id值。同样,右边提到的id是javascript的内部对象id,而不是用户的实际ID。
  • 要查看用户的真实ID,请在位置0处展开用户。

如果这不能回答您的问题,请详细说明您的问题以及错误或问题究竟是什么。


1
投票

这个问题源于一个误解,即Hibernate对GenerationType.AUTO的回退是GenerationType.SEQUENCE,而大多数人想要的是GenerationType.IDENTITY,所以你可以使用数据库分配给你的id。只需将策略更改为IDENTITY,您的问题就解决了。

© www.soinside.com 2019 - 2024. All rights reserved.