gpt4 book ai didi

java - 尝试保留用户时事务中止

转载 作者:太空宇宙 更新时间:2023-11-04 08:24:07 25 4
gpt4 key购买 nike

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

在这里,我只是“伪造”已经存在的组,因为我认为这会起作用。我无法将 cascade = CascadeType.PERSIST 添加到用户,因为这样它会再次保存组,从而导致重复数据。我该如何解决这个问题?

来自 EJB

public void persistAsUser(User user) {
Group group = new Group(2L, "user");
user.addGroup(group);

userRepository.persist(user);
}

javax.ejb.EJBException: Transaction aborted

Caused by: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade 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;

....

}

最佳答案

此问题通常发生在以下情况

  • 您有双向关联,但双方均未填充
  • 您有一个托管(用户)实体引用非托管实体()。

如果您不想保留Group,只需将 groups 设置为 null,如我的评论中所述。

但是,如果您想将用户关联到组,一个选项是

  1. 加载您想要将用户添加到的
  2. 用户添加到,反之亦然。
  3. 合并

请记住将组 -> 用户关系标记为 CascadeType.MERGE

关于java - 尝试保留用户时事务中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8946649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com