成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

躲不過JPA的坑之級聯保存

開發 前端
JPA全稱(Java Persistence API),通常叫持久層API。它提供面向對象的編程模型,讓使用者更容易理解與上手;底層也提供了通用接口,可以實現與其它框架快速集成。

?哈嘍,大家好,我是指北君。又是全新的一周,同時也是踩坑的開始,那就先洗滌下自己的心靈吧。

失敗者的一大弱點在于放棄,成功的必然之路就是不斷地重來一次。——托馬斯·愛迪生。

現在是不是熱血沸騰了,馬上開啟今天的分享~

前言

相信大部分java小伙伴在日常開發過程中,在存儲操作層都會選擇更容易上手的jpa,各種封裝,通過注解等方式,簡化了大量的代碼內容,同時提升了開發效率,但是(敲黑板,永遠都躲不開的但是...)相應也將一些問題隱藏,需要更多的時間去理解、分析才能找到病根。

?JPA簡介

JPA全稱(Java Persistence API),通常叫持久層API。它提供面向對象的編程模型,讓使用者更容易理解與上手;底層也提供了通用接口,可以實現與其它框架快速集成。下面整理一些基礎概念,不了解的可以參考下:

  • JPA是一種ORM規范。
  • Hibernate是JPA的一個子集。
  • Spring Data JPA,是JPA的代碼實現,同時底層為Hibernate技術實現。?

JPA實戰-級聯操作

目前小編所開發項目的數據持久層大部分采用的是Spring Data JPA,經過長時間的使用驗證,發現出了級聯保存問題,即調用repository的save方法后,發現數據結果卻是“丟三落四”,這就很讓人腦袋疼,下面結合代碼一起分析下。

  • 代碼場景:用戶與住址是多對多的關系,JPA中描述這種關系通常使用@ManyToMany注解,首先是創建對象;

//維護端
public class User{
//屬性代碼省略
@ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
@JoinTable(name = "user_addresses",
joinColumns = {@JoinColumn(name = "user_id",referencedColumnName = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "address_id",referencedColumnName = "address_id")})
private Set<Address> addresses = new HashSet<>();
}

//被維護方
public class Address{
//屬性代碼省略
@ManyToMany(mappedBy = "addresses")
@JsonIgnore
private Set<User> users = new HashSet<>();
}
  • 最初我只在維護端設置的級聯屬性(Cascade.ALL),然后通過維護端進行保存,很順利,User表、Address表、user_addresses關聯表都能保存,代碼如下,沒毛病。

// 維護端操作
public User save(){
Address address = new Address();
address.setAddressName("北京海淀");
User user1 = new User();
user1.setName("阿韋");
user1.getAddresses().add(address);
return UserService.save(User1);
}
  • 然后我換了個思路,從被維護端能不能進行保存,然后就立即進行嘗試。代碼如下:

// 被維護端操作
public Address save(){
Address address = new Address();
address.setAddressName("北京海淀");
User user1 = new User();
user1.setName("阿韋");
address.getUsers().add(user1);
return addressService.save(address);
}
  • 結果,我以為能夠成功的時候,發現只保存了Address一張表,還沒報錯,就是User表和關聯表死活沒有數據。此時,問題已經復現,查閱各種文檔說明,大概是需要添加級聯屬性,改造內容如下:

@ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER,mappedBy = "addresses")
private Set<User> users = new HashSet<>();
  • 修改之后再一次進行保存,兩個實體類的表確實都生成了數據,但是關聯表還是沒有,這時已經快要抓狂,但問題還是沒解決,繼續耐心分析,很快就在控制臺打印sql處發現了一些貓膩:

圖片

  • 果然是沒有對關聯表的數據操作,接下來又是一頓探索,終于找到根源了,由被維護端發起操作的時候,需要為關聯類屬性添加彼此,感覺真是關聯到“恩愛”的地步了,羨煞旁人啊!!!

// 被維護端操作
public Address save(){
Address address = new Address();
address.setAddressName("中央花園");
User user1 = new User();
user1.setName("阿韋");
user1.setHeight("170");
user1.setSex("1");
//在彼此定義對方類集合中添加
user1.getAddresses().add(address);
address.getUsers().add(user1);
return addressService.save(address);
}

圖片

  • 最終徹底解決掉了問題,數據持久化到相應的表中。自己也確實松了一口氣,過程雖然充滿曲折,但結果還是非常鼓舞自己的。

心得

希望本文能夠幫你避開jpa的坑,這就是小編最驕傲的事情。每一條道路上都是坑洼不平的,有些時候可能會掉入坑里,希望每個人都能重新站起來,跳過阻擋你的“坑”,最終會收獲到很多,讓自己變得更強。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2022-09-07 08:25:08

代理模式設計模式代碼

2019-01-18 12:34:25

微信互聯網微信封殺

2019-01-30 15:23:02

數據庫MySQLMongoDB

2020-10-19 12:36:25

隱私蘋果互聯網

2021-04-26 09:05:55

高并發索引MySQL

2018-09-17 08:41:40

5G設備廠商

2021-10-26 06:00:10

數據分析數據分析師中年危機

2023-05-15 08:24:46

2019-07-25 16:28:22

SQL數據庫索引

2019-08-13 19:38:24

SQL數據索引

2011-09-29 11:08:52

惠普激光打印機

2011-09-22 11:29:09

惠普激光打印機

2011-09-13 10:25:05

數據庫點滴

2021-11-12 05:33:45

WiFi輻射無線路由器

2018-12-19 13:45:56

Hive實踐存儲

2019-04-02 09:05:41

微軟開源Windows

2021-02-22 17:00:31

Service Mes微服務開發

2020-02-19 14:51:15

程序系統工程師

2010-10-22 17:33:02

2012-05-30 15:03:43

ibmdw
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线观看视频亚洲 | 日韩一级| 狠狠影院| 国产av毛片 | 日韩91| 国产精品国产a级 | 欧洲国产精品视频 | 久久国产精品-国产精品 | 国产视频中文字幕 | 成人免费淫片aa视频免费 | 一a一片一级一片啪啪 | 亚洲a一区二区 | 午夜视频在线 | 国产资源一区二区三区 | 亚洲欧美一区二区三区国产精品 | 性生生活大片免费看视频 | 久久这里只有精品首页 | a欧美 | 精品动漫一区 | 日本成年免费网站 | 精品欧美一区二区三区久久久 | 欧美一级做性受免费大片免费 | 精品自拍视频 | 亚洲 中文 欧美 日韩 在线观看 | 91久久久久久久久久久 | 韩日在线视频 | 欧美中文字幕一区二区 | 黄色国产在线视频 | 国产视频导航 | 国产一级影片 | 91极品欧美视频 | 国产精品国产三级国产播12软件 | 91精品国产综合久久久动漫日韩 | 国产在线精品一区二区 | 国产成人免费视频 | 在线亚洲电影 | 久久一| 国产精品国产a | av网站在线看 | 国产精品视频网 | 九九av|