使用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)文章
Java中定時(shí)器java.util.Timer的簡(jiǎn)單模擬
在Java中,定時(shí)器(Timer)是一個(gè)工具類,用于安排任務(wù)在指定時(shí)間后執(zhí)行或以指定的時(shí)間間隔重復(fù)執(zhí)行,本文就來(lái)講講如何簡(jiǎn)單模擬實(shí)現(xiàn)定時(shí)器吧2023-07-07
springboot使用log4j2異步日志提升性能的實(shí)現(xiàn)方式
這篇文章主要介紹了springboot使用log4j2異步日志提升性能,異步日志實(shí)現(xiàn)方式:將日志存入一個(gè)單獨(dú)的隊(duì)列中,有一個(gè)單獨(dú)的線程從隊(duì)列中獲取日志并寫入磁盤文件,需要的朋友可以參考下2022-05-05
SpringBoot3.3.X整合Mybatis-Plus的實(shí)現(xiàn)示例
本文介紹了在Spring Boot 3.3.2中整合MyBatis-Plus 3.5.7,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
jeefast和Mybatis實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的示例代碼
這篇文章主要介紹了jeefast和Mybatis實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的示例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
搜索一文入門ElasticSearch(節(jié)點(diǎn) 分片 CRUD 倒排索引 分詞)
這篇文章主要為大家介紹了搜索一文入門ElasticSearch(節(jié)點(diǎn) 分片 CRUD 倒排索引 分詞)的基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Java面向?qū)ο蟪绦蛟O(shè)計(jì):繼承,多態(tài)用法實(shí)例分析
這篇文章主要介紹了Java面向?qū)ο蟪绦蛟O(shè)計(jì):繼承,多態(tài)用法,結(jié)合實(shí)例形式分析了java繼承與多態(tài)的相關(guān)概念、原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-04-04
SpringBoot與spring security的結(jié)合的示例
這篇文章主要介紹了SpringBoot與spring security的結(jié)合的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03

