尝试保留用户时,事务中止

时间:2012-01-20 19:13:46

标签: java java-ee jpa

我正在尝试保存用户。用户实体和组实体具有双向多对多关系。但是这些组已经保存在数据库中(只有两个:管理员和用户)。

在这里,我只是“伪造”已经存在的群体,因为我认为这样可行。我无法将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;

       ....

}

2 个答案:

答案 0 :(得分:1)

此问题通常在

时发生
  • 您具有双方未填充的双向关联
  • 您有一个托管(User)实体引用非托管版(Group)。

如果您不想保留Group,请按照我的评论将组设置为null。

但是,如果要将用户与组关联,则一个选项是

  1. load您希望将用户添加到{/ 1>}
  2. Group添加到User,反之亦然。
  3. Group小组
  4. 请记住标记该组 - &gt;用户关系为merge

答案 1 :(得分:0)

通过将mappedBy属性放在User类中,您说Group类负责持久化关联。

由于关系是双向的,因此您可以将任一方指定为关系的拥有方。

尝试将mappedBy属性移动到Group类的ManyToMany批注,然后按原样保留用户。