【问题标题】:many-to-many relationship springboot mysql多对多关系springboot mysql
【发布时间】:2020-08-20 12:49:49
【问题描述】:

我有 2 个模型用户和角色,它是多对多的关系。 我需要添加一个用户并给他一个已经存在于我的数据库中的特定角色。 ------用户-----

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString

@Entity
@Table(name = "user")
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="user_Id")
    private int userId;
    @Column(name="name")
    private String name;
    @Column(name="lastname")
    private String lastname;
    @Column(name="email")
    private String email;
    @Column(name="password")
    private String password;
    @Column(name="isActive")
    private boolean isActive;
    @Column(name="lastActive")
    private String lastActive;
    @Column(name="createdDate")
    private String createdDate;
    @Column(name="isBlocked")
    private boolean isBlocked;
    
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "institution_id", nullable = false)
    @JsonIgnoreProperties(value = {"user"})
    private Institution institution;
    
    @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.DETACH,CascadeType.MERGE,CascadeType.REFRESH})
    @JoinTable(name = "user_has_role",
            joinColumns = {
                    @JoinColumn(name = "user_id", referencedColumnName = "user_id",
                            nullable = false, updatable = true)},
            inverseJoinColumns = {
                    @JoinColumn(name = "role_id", referencedColumnName = "role_id",
                            nullable = false, updatable = true)})
    @JsonIgnoreProperties(value = {"users"})
    private Set<Role> roles = new HashSet<>();

}

--------角色--------

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString

@Entity
@Table(name = "role")
public class Role {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="role_Id")
    private int roleId;
    @Column(name="name")
    private String name;
    @Column(name="description")
    private String description;
    @ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY)
    @JsonIgnoreProperties(value = {"roles"})
    private Set<User> users = new HashSet<>();

}

和应用程序的控制器

@PostMapping("/addUser")
    public String addUser(@RequestBody User user) {
        userrepository.save(user);
        return "user saved with name: " + user.getName();
    }

这是我通过 api 请求发送的 json 正文。

{
        "userId" : 7,
        "name": "test",
        "lastname": "testlast",
        "email": "testtest@yahoo.com",
        "password": "test123",
        "lastActive": "04/05/21",
        "createdDate": "02/04/20",
        "institution": {
            "institutionId": 4
            },
       "roles": [
            {
                "roleId": 2
            }
        ],  
        "active": false,
        "blocked": true
    }

我的 user-has-role 表中的一切都很好,一条记录添加了 userId = 7 和 roleId=2 但问题是表角色正在更新,字段名称和描述被删除并替换为空值...... 请有任何想法

【问题讨论】:

  • 你需要一个中间表。
  • 我有它...它的 user_has_role 检查实体
  • 我认为你需要为这个@PutMapping使用Put方法
  • 我现在就试试
  • 它没有工作它还从角色表中删除了记录......这是唯一的问题,它就像更新角色表并将名称和描述设置为 null 因为在 json 正文中它们不是指定...

标签: java mysql spring-boot api many-to-many


【解决方案1】:

您已将CascadeType.PERSIST 添加到UserRole @ManyToMany 加入。
User 实体被持久化到EntityManager 时,它也会持久化Role 实体。当您在Role 的请求负载中传递主键时,它将创建/更新角色表。

您需要从加入中删除CascadeType.PERSIST,它会按预期工作。

@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH })
    @JoinTable(name = "user_has_role",
            joinColumns = {
                    @JoinColumn(name = "user_id", referencedColumnName = "user_id",
                            nullable = false, updatable = true)},
            inverseJoinColumns = {
                    @JoinColumn(name = "role_id", referencedColumnName = "role_id",
                            nullable = false, updatable = true)})
    @JsonIgnoreProperties(value = {"users"})
    private Set<Role> roles = new HashSet<>();

【讨论】:

  • 我刚刚尝试过,遗憾的是更新角色表并将名称和描述设置为 null 时仍然存在同样的问题.. 有什么想法吗?
  • 尝试删除级联本身
  • 是的,我刚刚删除了所有级联值,它确实有效!非常感谢你总是救我!
猜你喜欢
  • 2014-12-11
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 2012-07-16
  • 2018-09-09
  • 2020-04-04
相关资源
最近更新 更多