Как сохранить отношение @ManyToMany - повторяющаяся запись или отдельная сущность

Я хочу сохранить свою сущность с помощью ManyToMany. Но у меня есть некоторые проблемы во время постоянного процесса.

Мои сущности:

@Entity
@Table(name = "USER")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long userId;

    @Column(name = "NAME", unique = true, nullable = false)
    String userName;

    @Column(name = "FORNAME")
    String userForname;

    @Column(name = "EMAIL")
    String userEmail;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "USER_USER_ROLES", joinColumns = @JoinColumn(name = "ID_USER"), inverseJoinColumns = @JoinColumn(name = "ID_ROLE"))
    List<UserRoles> userRoles = new ArrayList<UserRoles>();

    // getter et setter
}

а также

@Entity
@Table(name = "USER_ROLES")
public class UserRoles implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long userRolesId;

    @Column(unique = true, nullable = false, name = "ROLE_NAME")
    String roleName; 

    // getter et setter
}

Сервисный код:

User user = new User();
UserRoles role;
try {
    role = userRolesServices.getUserRoleByName("ROLE_USER"); // find jpql - transaction
} catch (RuntimeException e) {
    LOGGER.debug("No Roles found");
    role = new UserRoles("ROLE_USER"); // create new
}
user.addUserRole(role);
user.setUserName(urlId);
user.setUserForname(fullName);
user.setUserEmail(email);
userServices.createUser(user); // em.persist(user) - transaction

В первый раз, когда я пытаюсь сохранить пользователя с правами пользователя «ROLE_USER», нет проблем. Пользователь и UserRoles и соединительные таблицы вставляются.

Моя проблема, когда я пытаюсь сохранить второго пользователя с теми же пользовательскими ролями. Я проверяю, существуют ли UserRoles, найдя его (userRolesServices.getUserRoleByName (...)). Если существует -> добавить эти UserRoles в список пользователей (id + имя роли), в противном случае я создаю новый (только имя роли).

Когда я пытаюсь сохранить второго пользователя, я получаю следующее исключение:"отдельная сущность для сохранения: ..... UserRoles" (возможно, потому что getUserRoleByName выполняется в другой транзакции)

Если я не используюgetUserRoleByName (только * новые UserRoles ("ROLE_USER"); *), я получаю следующее исключение:"... ConstraintViolation: повторяющаяся запись для 'ROLE_NAME' ..."

Итак, как правильно сохранить сущность с@ManyToMany отношение?

Ответы на вопрос(3)

Ваш ответ на вопрос