【问题标题】:How to insert data in ManyToMany Rest Api如何在 ManyToMany Rest Api 中插入数据
【发布时间】:2022-01-18 07:50:53
【问题描述】:

我找不到在 Spring Boot 中使用 ManyToMany 插入数据的方法。谁能建议我如何在 Spring Boot 和 Hibernate 中使用 M-To-M 保存数据。

下面是我的代码。

实体

@Entity
@Table(name = "user_master")
public class Users {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer user_id;

    private String name;

    @JsonManagedReference
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "users_roles", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = {
            @JoinColumn(name = "role_id") })
    private Set<Roles> roles;

    // constructor and getter/setter
}

@Entity
@Table(name = "role_master")
public class Roles {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer role_id;

    private String name;

    @JsonBackReference
    @ManyToMany(cascade = CascadeType.ALL, mappedBy = "roles")
    private Set<Users> users;

    // constructor and getter/setter
}

服务

@Override
public Set<Users> addAddressPerson(Set<Users> users) {
    for(User user: users) {
        for(Roles roles: user.getRoles()) {
            roles.getUsers().add(user); // problem is in here
        }
    }
    return users.stream().map(userRepo::save).collect(Collectors.toSet());
}

邮递员

[
  {
    "name": "Michael",
    "roles": [
    {
        "name": "Project Manager"
    },
    {
        "name": "Software Developer"
    }
    ]
  }
]

错误

"message": "无法调用 "java.util.Set.add(Object)" 因为 "com.rest.RestApiPojo.Entity.Roles.getUsers()" 的返回值为 null"

【问题讨论】:

  • 1) 您需要额外的 for 循环来迭代 users 集合。 2)您正在尝试将List 类型的参数分配给Set 类型的属性,需要转换
  • @NikolaiShevchenko 我根据您的建议进行了更改,但在返回 UserRepo.save(users) 时出现错误 the method save(S) in the type CrudRepository&lt;Users,Integer&gt; is not applicable for the arguments (Set&lt;Users&gt;)
  • 您正在寻找 saveAll 功能:docs.spring.io/spring-data/jpa/docs/current/api/org/… 另外请务必查看这篇关于开启批处理的帖子:baeldung.com/spring-data-jpa-batch-inserts

标签: spring-boot hibernate


【解决方案1】:

试试

@Override
public Set<Users> addAddressPerson(List<Users> users) {
    for(User user: users) {
        for(Roles roles: user.getRoles()) {
            roles.getUsers().add(user);
        }
    }
    return users.stream().map(UserRepo::save).collect(Collectors.toSet());
}

@Entity
@Table(name = "user_master")
public class Users {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer user_id;

    private String name;

    @JsonManagedReference
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "users_roles", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = {
            @JoinColumn(name = "role_id") })
    private Set<Roles> roles = new HashSet<>();

    // constructor and getter/setter
}

@Entity
@Table(name = "role_master")
public class Roles {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer role_id;

    private String name;

    @JsonBackReference
    @ManyToMany(cascade = CascadeType.ALL, mappedBy = "roles")
    private Set<Users> users = new HashSet<>();

    // constructor and getter/setter
} 

【讨论】:

  • 用更新的代码再试一次,注意我也改变了addAddressPerson的返回类型
  • 更改以下字段:Users private Set&lt;Roles&gt; roles; -> private Set&lt;Roles&gt; roles = new HashSet&lt;&gt;(); Roles private Set&lt;Users&gt; users; -> private Set&lt;Users&gt; users = new HashSet&lt;&gt;();
  • Collectors.toList() 更改为 Collectors.toSet() ,这不应该是必需的,但我猜你更改了 addAddressPerson 函数的返回类型,所以我也在答案中更改了它
  • 请用您现在拥有的代码更新您的问题
  • 您似乎没有将字段User#rolesRoles#users 更改为默认为new HashSet&lt;&gt;()
猜你喜欢
  • 1970-01-01
  • 2012-06-10
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2014-06-19
  • 2021-11-08
相关资源
最近更新 更多