问答

@ManyToOne如何更新主键

作者:admin 2021-05-13 我要评论

题目描述 使用@ManyToOne如何更新主键 题目来源及自己的思路 用户表和部门表多对一的关系,现在在用户表上使用@ManyToOne,部门表使用了@OneToMany,然后当我想要...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

题目描述

使用@ManyToOne如何更新主键

题目来源及自己的思路

用户表和部门表多对一的关系,现在在用户表上使用@ManyToOne,部门表使用了@OneToMany,然后当我想要修改用户的部门时,调用修改接口,传递参数为用户ID和部门ID,请问如何去更新呢?

相关代码

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table (name = "t_dept")
public class Department extends BaseEntity {
 @Column(columnDefinition="varchar(20) DEFAULT '' COMMENT '部门中文名'")
 private String deptName;
 @Column(columnDefinition="varchar(20) DEFAULT '' COMMENT '部门名'")
 private String dept;
 @Column(columnDefinition="int DEFAULT 0 COMMENT '上级部门ID'")
 private Integer parentDeptId;
 @OneToMany (mappedBy = "dept",cascade= CascadeType.ALL,fetch= FetchType.LAZY)
 private Set< User > users;
 @OneToMany (mappedBy = "dept",cascade=CascadeType.ALL,fetch=FetchType.LAZY)
 private Set< Role > roles;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "t_user")
public class User extends BaseEntity  {
 @Column(columnDefinition="varchar(20) DEFAULT '' COMMENT '用户名'",nullable = false)
 private String username;
 @Column(columnDefinition="varchar(100) DEFAULT '' COMMENT '密码'",nullable = false)
 private String password;
 @ManyToOne ( cascade = CascadeType.ALL, fetch = FetchType.LAZY )
 @JoinColumn ( name = "dept_id" )
 private Department dept;
 @ManyToOne ( cascade = CascadeType.ALL, fetch = FetchType.LAZY )
 @JoinColumn ( name = "role_id" )
 private Role role;
  }
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserUpdateReq {
 @NotNull
 private Integer id;
 @Length (max=20,min = 8,message = "用户名长度8-20位")
 private String username;
 @Length(max=16,min = 8,message = "密码长度8-16位")
 private String password;
 @NotNull
 private Integer deptId;
 @NotNull
 private Integer roleId;
}

你期待的结果是什么?实际看到的错误信息又是什么?

我希望查询出来的结果是用户关联部门信息,例如当传的deptId为2的时候,用户由部门1变成部门2的信息,实际错误是使用了CascadeType会导致对应部门ID信息被变更为null,但是不加CascadType的话会导致用户没有部门信息

###

这种直接用语句更新好点

###

jpa的双向关联是个大坑,这里建议尽量不要使用双向关联.
这里由于你使用了双向关联,所以必须两边都要相互设置才能达成想要的结果

user.setDept(dept2); // 由于是双向关联,所以这样还不够
userRepository.save(user);
dept2.getUsers().add(user); // 还需要反向关联一遍
deptRepository.save(dept2);

并且你两边都设置了cascade 是非常危险的,说不定哪一天就莫名其妙的数据紊乱.
就不说还有各种序列化循环引用的问题了.
总之不要双向关联!不要双向关联!不要双向关联!

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 请问下prometheus怎么进行自定义的按业

    请问下prometheus怎么进行自定义的按业

  • 节流函数为什么,点击无效,监听窗口大

    节流函数为什么,点击无效,监听窗口大

  • express访问静态资源失败

    express访问静态资源失败

  • IE 浏览器下 match 方法报错

    IE 浏览器下 match 方法报错

腾讯云代理商
海外云服务器