使用JPA单项一对多外键关联

目录

JPA单项一对多外键关联

JPA外键关联保存踩坑

解决

JPA单项一对多外键关联

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

User主表代码

@Table(name="USER") @Entity public class User { private Integer id; private String username; private String userpassword; private String useraddress; private List<Order> listOrder; @JoinColumn(name="LIST_ORDER") @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.REMOVE) public List<Order> getListOrder() { return listOrder; } public void setListOrder(List<Order> listOrder) { this.listOrder = listOrder; } @Id @TableGenerator(name="PK_PRIMARY", table="order_user_sque", pkColumnName="pk_column_name", pkColumnValue="pk_column", valueColumnName="pk_column_value", allocationSize=1) @GeneratedValue(strategy=GenerationType.TABLE,generator="PK_PRIMARY") public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(name="USERNAME") public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @Column(name="USERPASSWORD") public String getUserpassword() { return userpassword; } public void setUserpassword(String userpassword) { this.userpassword = userpassword; } @Column(name="USERADDRESS") public String getUseraddress() { return useraddress; } public void setUseraddress(String useraddress) { this.useraddress = useraddress; } }

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

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

Order从表代码

@Entity @Table(name="ORDER_USER") public class Order { private Integer id; private String orderName; //private User user; @Id @GeneratedValue public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getOrderName() { return orderName; } public void setOrderName(String orderName) { this.orderName = orderName; } } JPA外键关联保存踩坑

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

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

这样关联的

一度迷茫

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

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

解决

去掉  optional = false

源码提示

翻译

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

细节决定成败

以上为个人经验,希望能给大家一个参考,也希望大家多多支持易知道(ezd.cc)。

推荐阅读