Я хочу сохранить свою сущность с отношением 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, найдя его ( userRolesServices.getUserRoleByName (...) ).Если существует -> добавить эти UserRoles в список пользователей (id + имя роли), иначе я создаю новый (только имя роли).
Когда я пытаюсь сохранить второго пользователя, я получаю следующее исключение: «отдельная сущность для сохранения: ..... UserRoles» (возможно, потому что getUserRoleByName выполняется в другой транзакции)
Если я не использую getUserRoleByName (только *новые UserRoles ("ROLE_USER"); *), я получаю следующее исключение: "... ConstraintViolation: Дублированная запись для 'ROLE_NAME' ..."
Итак, как правильносохранить сущность с @ ManyToMany отношением?