我正在尝试保存用户。用户实体和组实体具有双向多对多关系。但是这些组已经保存在数据库中(只有两个:管理员和用户)。
在这里,我只是“伪造”已经存在的群体,因为我认为这样可行。我无法将cascade = CascadeType.PERSIST
添加到用户,因为它会再次保存组,从而导致重复数据。我该如何解决这个问题?
来自EJB
public void persistAsUser(User user) {
Group group = new Group(2L, "user");
user.addGroup(group);
userRepository.persist(user);
}
javax.ejb.EJBException:事务已中止
引起:java.lang.IllegalStateException:在同步期间a 通过未标记的关系找到新对象 级联PERSIST:
以下是实体:
@Entity
@Table(name = "app_user")
public class User implements Serializable {
public static final String ALL = "User.all";
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private Integer age;
private String username;
private String email;
private String password;
@ManyToMany(mappedBy = "users")
private List<Group> groups;
....
public void addGroup(Group group) {
if (!getGroups().contains(group)) {
getGroups().add(group);
}
if (!group.getUsers().contains(this)) {
group.getUsers().add(this);
}
}
}
和
@Entity
public class Group implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String groupName;
@ManyToMany
@JoinTable(joinColumns = {@JoinColumn(name="group_id")}, inverseJoinColumns = {@JoinColumn(name="user_id")})
private List<User> users;
....
}
答案 0 :(得分:1)
此问题通常在
时发生User
)实体引用非托管版(Group
)。如果您不想保留Group
,请按照我的评论将组设置为null。
但是,如果要将用户与组关联,则一个选项是
load
您希望将用户添加到{/ 1>} Group
添加到User
,反之亦然。Group
小组请记住标记该组 - &gt;用户关系为merge
答案 1 :(得分:0)
通过将mappedBy属性放在User类中,您说Group类负责持久化关联。
由于关系是双向的,因此您可以将任一方指定为关系的拥有方。
尝试将mappedBy属性移动到Group类的ManyToMany批注,然后按原样保留用户。