Я относительно новичок в спящем режиме.Я использую hibernate с Spring boot 1.5, и я столкнулся со странной проблемой, которую я не знаю, как исправить.
На изображении ниже вы заметите, что то же поле электронной почты повторяется.
Объект модели пользователя
@Data
@Entity
@Table(name = "user")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdAt", "updatedAt"}, allowGetters = false)
@DynamicUpdate
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
...
private Boolean isActive;
@OneToMany(mappedBy = "user", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<UserEmail> emails = new ArrayList<>();
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "users_roles",
joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;
public void addUserEmail(UserEmail email) {
email.setUser(this);
this.emails.add(email);
}
public void removeUserEmail(UserEmail email) {
emails.remove(email);
email.setUser(null);
}
}
Объект модели UserEmail
@Data
@Entity
@EntityListeners(AuditingEntityListener.class)
public class UserEmail {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@Email
@NaturalId(mutable = true)
@Column(name = "email", unique = true)
private String email;
}
Но в базе данных электронная почта фактически не повторяется.
Ниже приведен SQL-запрос, выполняемый, когда я хочу получить пользователя:
Hibernate: select user0_.id as id1_2_0_, user0_.created_at as created_2_2_0_,
user0_.first_name as first_na3_2_0_, user0_.is_active as is_activ4_2_0_,
user0_.last_name as last_nam5_2_0_, user0_.password as password6_2_0_,
user0_.phone as phone7_2_0_, user0_.updated_at as updated_8_2_0_,
user0_.username as username9_2_0_, emails1_.user_id as user_id3_4_1_,
emails1_.id as id1_4_1_, emails1_.id as id1_4_2_, emails1_.email as
email2_4_2_, emails1_.user_id as user_id3_4_2_, roles2_.user_id as
user_id1_5_3_, role3_.id as role_id2_5_3_, role3_.id as id1_1_4_, role3_.name
as name2_1_4_ from user user0_ left outer join user_email emails1_ on
user0_.id=emails1_.user_id left outer join users_roles roles2_ on
user0_.id=roles2_.user_id left outer join role role3_ on
roles2_.role_id=role3_.id where user0_.id=1
, который дает мне следующий результат
На картинке видно, что возвращаются две строки.SQL-запрос, созданный hibernate, несколько выбирает один и тот же результат электронной почты для каждой роли.Я понимаю (и перепроверил), что это происходит только в случае пользователей с более чем одной ролью.Теперь, когда электронные письма одинаковы, не должен ли hibernate / jpa правильно идентифицировать и объединить два электронных письма в одно?
Как мне решить эту проблему?Любая помощь приветствуется.Я понимаю, что мой вопрос не может быть хорошо объяснен, поэтому, если у вас есть путаница, пожалуйста, спросите.