gpt4 book ai didi

hibernate - JpaRepository 不会插入多对多数据

转载 作者:行者123 更新时间:2023-12-04 02:18:45 27 4
gpt4 key购买 nike

我有使用 JPA 工具生成的用户实体和角色实体。 User 和 Role 是多对多的关系。我使用以下代码插入管理员,但是,没有数据插入到 user_role 表中。我还注意到角色类有 @JoinTable 但用户类没有。有区别吗?

private void addAdmin() {
User admin = new User();
admin.setDisplayName("admin");

Role role1 = new Role();
role1.setRole("ROLE_SUPER_ADMIN");
Role role2 = new Role();
role2.setRole("ROLE_END_USER");
List<Role> roles = new ArrayList<Role>();
roles.add(role1);
roles.add(role2);
admin.setRoles(roles);
userRepository.save(admin);
}

以下是我的用户类:

@Entity
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

@Column(name="display_name")
private String displayName;

//bi-directional many-to-many association to Role
@ManyToMany(mappedBy="users")
private List<Role> roles;
}

以下是我的角色类:

@Entity
@NamedQuery(name="Role.findAll", query="SELECT r FROM Role r")
public class Role implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

private String role;

//bi-directional many-to-many association to User
@ManyToMany
@JoinTable(
name="user_role"
, joinColumns={
@JoinColumn(name="role_id")
}
, inverseJoinColumns={
@JoinColumn(name="user_id")
}
)
private List<User> users;
}

最佳答案

User 实体中的

roles 关联是关联的反面(由mappedBy 指定)。这意味着维护关联是 Role 类的职责,因此要使关联更改持久化,您还必须修改所有者端:

role1.getUsers().add(admin);
role2.getUsers().add(admin);

不管怎样,总是更新双向关联的两边是一个很好的约定,这样反面的状态也能反射(reflect)出owner端的变化。这就是为什么通常的做法是创建更改关联双方的辅助方法:

@Entity
public class User {

//bi-directional many-to-many association to Role
@ManyToMany(mappedBy="users")
private List<Role> roles;

public void addRole(Role role) {
if (!roles.contains(role)) {
roles.add(role);
role.addUser(this);
}
}
}

@Entity
public class Role {

//bi-directional many-to-many association to User
@ManyToMany
@JoinTable(
...
)
private List<User> users;

public void addUser(User user) {
if (!users.contains(user)) {
users.add(user);
user.addRole(this);
}
}
}

关于hibernate - JpaRepository 不会插入多对多数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32550979/

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