2017-12-18 164 views
0

我对此有点不安,我只是为了了解正在发生的事情而寻求帮助。我无法生成自动递增的ID,并且休眠始终生成1,因为ID

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

任何帮助将受到欢迎。

谢谢。

回答

1

(道歉没有足够的信誉发表评论)

我并不清楚明白你的问题。无论如何,我会尽力根据我认为是你的问题来解释。

  • 默认情况下,AUTO_INCREMENT的起始值为1,而 将为每个新记录增加1。所以预期这种行为。
  • 如果您希望它的值不是1,那么您必须使用 GenerationType.SEQUENCE并进行适当的更改。
  • 此搜索:你刚才提到,该值越来越进入 数据库正确,这表明ID值被 产生正确
  • 镜像2:用户来说是一个Javascript数组。 javascript 数组的索引值始终从零开始。这只是索引值而不是 的id值。同样,右侧提到的ID是 javascript的内部对象ID,而不是用户的实际ID。
  • 要查看该用户的真实身份,扩大用户的位置0

如果这不回答你的问题,请详细说明您的问题,究竟出了什么错误或问题。

1

的问题,从一个误解,其中Hibernate的回退为GenerationType.AUTOGenerationType.SEQUENCE茎,而大多数人想的是GenerationType.IDENTITY,这样你就可以利用数据库为您分配的ID。只需将策略更改为IDENTITY即可解决问题。