Я немного смущен этим, и я прошу помощи только для того, чтобы понять, что происходит.
Итак, у меня есть эта таблица (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 для нового пользователя.
Но в базе данных я вижу все правильно.
И когда я ищу всех пользователей, я получаю следующее:
public List<User> getAll() {
return userRepository.findAll();
}
Аналогичная функция JPDA ObjectReference.
Любая помощь будет приветствоваться.
Благодарю.
Проблема связана с недоразумением, когда Hibernate fallback для GenerationType.AUTO
- GenerationType.SEQUENCE
, в то время как большинству людей требуется GenerationType.IDENTITY
, поэтому вы можете использовать идентификатор, который вам присваивает база данных. просто измените стратегию на IDENTITY
и ваша проблема решена.
(Извинения за то, что у вас недостаточно репутации, чтобы оставить комментарий)
Я не понимаю ваш вопрос. В любом случае я попытаюсь объяснить, исходя из того, что, по вашему мнению, является вашей проблемой.
Если это не отвечает на ваши вопросы, любезно уточните свой вопрос и какова именно ошибка или проблема.