В настоящее время у меня есть полностью работоспособное приложение Spring, которое очень тщательно протестировано и успешно работает в производстве уже более года. В последнее время я хотел иметь проверку подлинности спящего режима в поле имени пользователя. Поле имени пользователя используется для входа в систему, а также является электронной почтой наших пользователей.Spring или Hibernate не генерируют идентификатор, когда имя пользователя аннотируется с помощью @email
Когда я аннотировать username
поля с @Email
, идентификатор (аннотированный с @Id
и @Generated(strategy = GenerationType.AUTO)
) не генерируется больше, и сохраняет значение null
. Это приводит к ошибке hashCode
на NullPointerException
(никаких проблем с этим, хотя). Поэтому по какой-то причине идентификатор больше не генерируется из-за добавления аннотации @Email
к объекту User.java
.
@Entity
@Table(uniqueConstraints = @UniqueConstraint(name = "username",
columnNames = "username"))
public class User implements Serializable, UserDetails {
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long id;
@Column(nullable = false)
@JsonView(View.NoProfile.class)
@Email
protected String username;
@Column(nullable = false)
private String passwordHash;
@JsonIgnore
@ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
@CollectionTable(name = "user_role")
private Set<Role> roles;
@OneToOne(targetEntity = Profile.class, cascade = CascadeType.ALL)
@JsonView(View.Public.class)
protected Profile profile;
@JsonIgnore
private boolean accountNonExpired = true;
@JsonIgnore
private boolean accountNonLocked = true;
@JsonIgnore
private boolean credentialsNonExpired = true;
@JsonIgnore
private boolean enabled = true;
public User(String username, String passwordHash) {
this.username = username;
this.passwordHash = passwordHash;
this.profile = new Profile();
this.roles = new HashSet<>();
roles.add(Role.ROLE_USER);
}
User() { // jpa only
}
public Profile getProfile() {
return profile;
}
public Long getId() {
return id;
}
public void setPasswordHash(String passwordHash) {
this.passwordHash = passwordHash;
}
@Override
public Set<? extends GrantedAuthority> getAuthorities() {
return roles;
}
@Override
@JsonIgnore
public String getPassword() {
return passwordHash;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public boolean isAccountNonExpired() {
return accountNonExpired;
}
@Override
public boolean isAccountNonLocked() {
return accountNonLocked;
}
@Override
public boolean isCredentialsNonExpired() {
return credentialsNonExpired;
}
@Override
public boolean isEnabled() {
return enabled;
}
public void resetProfile() {
this.profile = new Profile();
}
public void addRole(Role role) {
this.roles.add(role);
}
public void setAccountNonLocked(boolean accountNonLocked) {
this.accountNonLocked = accountNonLocked;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
@JsonView(View.Public.class)
public int getReference() {
return username.hashCode();
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
User user = (User) o;
return username.equals(user.username) && id.equals(user.id);
}
@Override
public int hashCode() {
int result = username.hashCode();
result = 31 * result + id.hashCode();
return result;
}
}
Вы еще не изменили схему или сущность базы данных? А потом не удалось обновить? – Snickers3192
У вас есть? <свойство name = "hibernate.hbm2ddl.auto"> обновление, или создать тоже хорошо. – Snickers3192
Это происходит либо из 'create', либо' create-drop', поэтому база данных должна быть права. – martijn9612