如何持久化@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
第一次,当我尝试使用UserRoles“ROLE_USER”持久化User时,没问题。插入用户和用户角色以及联接表。
我的问题是当我尝试使用相同的UserRoles持久化第二个用户时。我通过找到UserRoles来检查它是否存在(userRolesServices.getUserRoleByName(...))。如果存在 ->将此用户角色添加到用户列表(id + 角色名称),否则我将创建一个新用户(仅角色名称)。
当我尝试持久化第二个用户时,我得到以下异常:“分离实体持久化:.....UserRoles“(也许是因为getUserRoleByName在另一个事务中执行)
如果我不使用getUserRoleByName(只有*new UserRoles(“ROLE_USER”);*),我得到以下例外:“...约束暴力:“ROLE_NAME”的重复条目...”
那么,如何正确地持久化一个具有@ManyToMany关系的实体呢?