使用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,則必須始終存在非空關系。
*/
細節決定成敗
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- jpa onetomany 使用級連表刪除被維護表數據時的坑
- Spring Boot 整合JPA 數據模型關聯使用操作(一對一、一對多、多對多)
- 使用JPA雙向多對多關聯關系@ManyToMany
- 繼承jpa Repository 寫自定義方法查詢實例
- SpringData JPA中@OneToMany和@ManyToOne的用法詳解