经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
使用JPA单项一对多外键关联
来源:jb51  时间:2022/6/21 16:40:55  对本文有异议

JPA单项一对多外键关联

一对多即一个对象中包含又另外一个对象的集合。

User主表代码

  1. @Table(name="USER")
  2. @Entity
  3. public class User {
  4. private Integer id;
  5. private String username;
  6. private String userpassword;
  7. private String useraddress;
  8. private List<Order> listOrder;
  9.  
  10. @JoinColumn(name="LIST_ORDER")
  11. @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.REMOVE)
  12. public List<Order> getListOrder() {
  13. return listOrder;
  14. }
  15. public void setListOrder(List<Order> listOrder) {
  16. this.listOrder = listOrder;
  17. }
  18. @Id
  19. @TableGenerator(name="PK_PRIMARY",
  20. table="order_user_sque",
  21. pkColumnName="pk_column_name",
  22. pkColumnValue="pk_column",
  23. valueColumnName="pk_column_value",
  24. allocationSize=1)
  25. @GeneratedValue(strategy=GenerationType.TABLE,generator="PK_PRIMARY")
  26. public Integer getId() {
  27. return id;
  28. }
  29. public void setId(Integer id) {
  30. this.id = id;
  31. }
  32.  
  33. @Column(name="USERNAME")
  34. public String getUsername() {
  35. return username;
  36. }
  37. public void setUsername(String username) {
  38. this.username = username;
  39. }
  40.  
  41. @Column(name="USERPASSWORD")
  42. public String getUserpassword() {
  43. return userpassword;
  44. }
  45.  
  46. public void setUserpassword(String userpassword) {
  47. this.userpassword = userpassword;
  48. }
  49.  
  50. @Column(name="USERADDRESS")
  51. public String getUseraddress() {
  52. return useraddress;
  53. }
  54. public void setUseraddress(String useraddress) {
  55. this.useraddress = useraddress;
  56. }
  57. }

代码中:@JoinColumn(name="LIST_ORDER") -> 表示将外键名设置为LIST_ORDER

@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.REMOVE) -> OneToMany中fetch表示查询时的加载模式[懒加载还是积极加载],cascade属性表示要级联操作的模式,此处为删除主表后从表一并删除。

Order从表代码

  1. @Entity
  2. @Table(name="ORDER_USER")
  3. public class Order {
  4. private Integer id;
  5. private String orderName;
  6. //private User user;
  7.  
  8. @Id
  9. @GeneratedValue
  10. public Integer getId() {
  11. return id;
  12. }
  13. public void setId(Integer id) {
  14. this.id = id;
  15. }
  16. public String getOrderName() {
  17. return orderName;
  18. }
  19. public void setOrderName(String orderName) {
  20. this.orderName = orderName;
  21. }
  22. }

JPA外键关联保存踩坑

比如:用户表关联了用户地址的主键 

在用户还没有设置地址的时候 能单独添加用户和更新用户的个人信息 但是当用户添加地址的时候去更新数据的时候 jpa却是插入数据 而不是更新数据、这个时候用户表中的唯一字段则会报错、信息已存在!

这样关联的

一度迷茫

后来通过sql打印日记 查看到 

jpa 在进行关联操作的时候 会通过外键查询一次、由于还没绑定外键 查询为空 这时候jpa就会以为是新增操作,则进行insert 操作

解决

去掉  optional = false

源码提示

翻译

/**
      *(可选)关联是否可选。 如果设置
      *为false,则必须始终存在非空关系。
     */

细节决定成败

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号