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

标签 hibernate jpa many-to-many

我有使用 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/

相关文章:

mysql - 我应该在 php 和 mysql 中将 friend 存储为 "strings"还是 "integers"?

hibernate 多对多配置

java - Hibernate/JPA 注释中的多列连接

java - Hibernate:Query By Example 等效于关联条件查询

java - 使用 Predicate 和 Criteria API 进行不区分大小写的搜索

java - Hibernate JPA一对一保存子类实体

java - 面临无法延迟初始化集合并且无法初始化代理 - 无 session

java - 如何转换略有不同的表?

java - JPA无效流头: 32303138

mysql - 如何选择和更新涉及两个表的查询