使用JPA單項(xiàng)一對(duì)多外鍵關(guān)聯(lián)
JPA單項(xiàng)一對(duì)多外鍵關(guān)聯(lián)
一對(duì)多即一個(gè)對(duì)象中包含又另外一個(gè)對(duì)象的集合。
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") -> 表示將外鍵名設(shè)置為L(zhǎng)IST_ORDER
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.REMOVE) -> OneToMany中fetch表示查詢時(shí)的加載模式[懶加載還是積極加載],cascade屬性表示要級(jí)聯(lián)操作的模式,此處為刪除主表后從表一并刪除。
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外鍵關(guān)聯(lián)保存踩坑
比如:用戶表關(guān)聯(lián)了用戶地址的主鍵
在用戶還沒(méi)有設(shè)置地址的時(shí)候 能單獨(dú)添加用戶和更新用戶的個(gè)人信息 但是當(dāng)用戶添加地址的時(shí)候去更新數(shù)據(jù)的時(shí)候 jpa卻是插入數(shù)據(jù) 而不是更新數(shù)據(jù)、這個(gè)時(shí)候用戶表中的唯一字段則會(huì)報(bào)錯(cuò)、信息已存在!
這樣關(guān)聯(lián)的
一度迷茫
后來(lái)通過(guò)sql打印日記 查看到
jpa 在進(jìn)行關(guān)聯(lián)操作的時(shí)候 會(huì)通過(guò)外鍵查詢一次、由于還沒(méi)綁定外鍵 查詢?yōu)榭?這時(shí)候jpa就會(huì)以為是新增操作,則進(jìn)行insert 操作
解決
去掉 optional = false
源碼提示
翻譯
/**
*(可選)關(guān)聯(lián)是否可選。 如果設(shè)置
*為false,則必須始終存在非空關(guān)系。
*/
細(xì)節(jié)決定成敗
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解基于Mybatis-plus多租戶實(shí)現(xiàn)方案
這篇文章主要介紹了詳解基于Mybatis-plus多租戶實(shí)現(xiàn)方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04SpringBoot JPA實(shí)現(xiàn)增刪改查、分頁(yè)、排序、事務(wù)操作等功能示例
本篇文章主要介紹了SpringBoot JPA實(shí)現(xiàn)增刪改查、分頁(yè)、排序、事務(wù)操作等功能示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03解決java web應(yīng)用線上系統(tǒng)偶發(fā)宕機(jī)的情況
這篇文章主要介紹了解決java web應(yīng)用線上系統(tǒng)偶發(fā)宕機(jī)的情況,具有好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09java實(shí)現(xiàn)飯店點(diǎn)菜系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)飯店點(diǎn)菜系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01SpringCloud中的Ribbon負(fù)載均衡器詳細(xì)解析
這篇文章主要介紹了SpringCloud中的Ribbon負(fù)載均衡器詳細(xì)解析,Ribbon 是一個(gè)基于 HTTP 和 TCP 的客戶端負(fù)載均衡工具,它基于 Netflix Ribbon 實(shí)現(xiàn),通過(guò)封裝可以讓我們輕松地將面向服務(wù)的 REST 模版請(qǐng)求自動(dòng)轉(zhuǎn)換成客戶端負(fù)載均衡的服務(wù)調(diào)用,需要的朋友可以參考下2024-01-01一步步教你搭建Scala開(kāi)發(fā)環(huán)境(非常詳細(xì)!)
Scala是一門(mén)基于jvm的函數(shù)式的面向?qū)ο缶幊陶Z(yǔ)言,擁有比java更加簡(jiǎn)潔的語(yǔ)法,下面這篇文章主要給大家介紹了關(guān)于搭建Scala開(kāi)發(fā)環(huán)境的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04