Hibernate не допускает не уникальные записи, даже если unique - false - PullRequest
0 голосов
/ 26 марта 2019

У меня есть база данных с пользователями и их паролями. Когда я запускаю свое приложение, я создаю некоторых пользователей с ролями и сохраняю их в базе данных. Мой пользовательский объект:

@Entity
@Table(name = "USERS")
public class User {
    @Id
    @Column(name = "USERNAME",  nullable = false,  unique = true)
    private String username;

    @Column(name = "PASSWORD", nullable = false)
    private String password;

    @Column(name = "ENABLED", nullable = false)
    private boolean enabled = true;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.EAGER)
    private Set<UserRole> userRole = new HashSet<>();
...getters and setters

и сущность userRole

@Entity
@Table(name = "user_roles")
public class UserRole {


    @Id
    @Column(name = "ROLE")
    private String role;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "USERNAME")
    private User user;

роль столбца уникальна = по умолчанию false, но когда я добавляю userA с ролями: admin, user, а затем userB с ролями: user, запись userB - пользователь перезаписывает запись userA - пользователь. Может кто-нибудь указать, в чем моя ошибка?

Я использую Hibernate 5 + Spring 5

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Идентификатор по определению уникален. Это то, что уникально идентифицирует сущность.

0 голосов
/ 26 марта 2019

Если вы сохраняете роль для пользователя B, поскольку у вас есть сопоставление для пользователя в UserRole и CascadeType.ALL, после сохранения оно переопределяет USERNAME роли user в вашей базе данных. Вам действительно нужно сопоставление пользователя в UserRole? Если это не обязательно, я думаю, что вы должны удалить его из сущности UserRole и оставить только имя роли. Например, можно сопоставить роль в пользователе как

    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "username"))
    @Column(name = "role")
    @ElementCollection(fetch = FetchType.EAGER)
    private Set<Role> roles;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...