Почему JPA не может объединить несколько (но одинаковых) результатов, возвращаемых hibernate? - PullRequest
0 голосов
/ 24 ноября 2018

Я относительно новичок в спящем режиме.Я использую hibernate с Spring boot 1.5, и я столкнулся со странной проблемой, которую я не знаю, как исправить.

На изображении ниже вы заметите, что то же поле электронной почты повторяется.Database shows single entry of email address but appears twice in UI

Объект модели пользователя

@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

, который дает мне следующий результат two rows returned

На картинке видно, что возвращаются две строки.SQL-запрос, созданный hibernate, несколько выбирает один и тот же результат электронной почты для каждой роли.Я понимаю (и перепроверил), что это происходит только в случае пользователей с более чем одной ролью.Теперь, когда электронные письма одинаковы, не должен ли hibernate / jpa правильно идентифицировать и объединить два электронных письма в одно?

Как мне решить эту проблему?Любая помощь приветствуется.Я понимаю, что мой вопрос не может быть хорошо объяснен, поэтому, если у вас есть путаница, пожалуйста, спросите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...