偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

躲不過(guò)JPA的坑之級(jí)聯(lián)保存

開發(fā) 前端
JPA全稱(Java Persistence API),通常叫持久層API。它提供面向?qū)ο蟮木幊棠P?,讓使用者更容易理解與上手;底層也提供了通用接口,可以實(shí)現(xiàn)與其它框架快速集成。

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

失敗者的一大弱點(diǎn)在于放棄,成功的必然之路就是不斷地重來(lái)一次?!旭R斯·愛(ài)迪生。

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

前言

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

?JPA簡(jiǎn)介

JPA全稱(Java Persistence API),通常叫持久層API。它提供面向?qū)ο蟮木幊棠P停屖褂谜吒菀桌斫馀c上手;底層也提供了通用接口,可以實(shí)現(xiàn)與其它框架快速集成。下面整理一些基礎(chǔ)概念,不了解的可以參考下:

  • JPA是一種ORM規(guī)范。
  • Hibernate是JPA的一個(gè)子集。
  • Spring Data JPA,是JPA的代碼實(shí)現(xiàn),同時(shí)底層為Hibernate技術(shù)實(shí)現(xiàn)。?

JPA實(shí)戰(zhàn)-級(jí)聯(lián)操作

目前小編所開發(fā)項(xiàng)目的數(shù)據(jù)持久層大部分采用的是Spring Data JPA,經(jīng)過(guò)長(zhǎng)時(shí)間的使用驗(yàn)證,發(fā)現(xiàn)出了級(jí)聯(lián)保存問(wèn)題,即調(diào)用repository的save方法后,發(fā)現(xiàn)數(shù)據(jù)結(jié)果卻是“丟三落四”,這就很讓人腦袋疼,下面結(jié)合代碼一起分析下。

  • 代碼場(chǎng)景:用戶與住址是多對(duì)多的關(guān)系,JPA中描述這種關(guān)系通常使用@ManyToMany注解,首先是創(chuàng)建對(duì)象;

//維護(hù)端
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<>();
}

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

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

// 被維護(hù)端操作
public Address save(){
Address address = new Address();
address.setAddressName("北京海淀");
User user1 = new User();
user1.setName("阿韋");
address.getUsers().add(user1);
return addressService.save(address);
}
  • 結(jié)果,我以為能夠成功的時(shí)候,發(fā)現(xiàn)只保存了Address一張表,還沒(méi)報(bào)錯(cuò),就是User表和關(guān)聯(lián)表死活沒(méi)有數(shù)據(jù)。此時(shí),問(wèn)題已經(jīng)復(fù)現(xiàn),查閱各種文檔說(shuō)明,大概是需要添加級(jí)聯(lián)屬性,改造內(nèi)容如下:

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

圖片

  • 果然是沒(méi)有對(duì)關(guān)聯(lián)表的數(shù)據(jù)操作,接下來(lái)又是一頓探索,終于找到根源了,由被維護(hù)端發(fā)起操作的時(shí)候,需要為關(guān)聯(lián)類屬性添加彼此,感覺(jué)真是關(guān)聯(lián)到“恩愛(ài)”的地步了,羨煞旁人?。。?!

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

圖片

  • 最終徹底解決掉了問(wèn)題,數(shù)據(jù)持久化到相應(yīng)的表中。自己也確實(shí)松了一口氣,過(guò)程雖然充滿曲折,但結(jié)果還是非常鼓舞自己的。

心得

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

責(zé)任編輯:武曉燕 來(lái)源: Java技術(shù)指北
相關(guān)推薦

2022-09-07 08:25:08

代理模式設(shè)計(jì)模式代碼

2019-01-18 12:34:25

微信互聯(lián)網(wǎng)微信封殺

2019-01-30 15:23:02

數(shù)據(jù)庫(kù)MySQLMongoDB

2020-10-19 12:36:25

隱私蘋果互聯(lián)網(wǎng)

2021-04-26 09:05:55

高并發(fā)索引MySQL

2018-09-17 08:41:40

5G設(shè)備廠商

2021-10-26 06:00:10

數(shù)據(jù)分析數(shù)據(jù)分析師中年危機(jī)

2023-05-15 08:24:46

2019-08-13 19:38:24

SQL數(shù)據(jù)索引

2019-07-25 16:28:22

SQL數(shù)據(jù)庫(kù)索引

2011-09-29 11:08:52

惠普激光打印機(jī)

2011-09-22 11:29:09

惠普激光打印機(jī)

2011-09-13 10:25:05

數(shù)據(jù)庫(kù)點(diǎn)滴

2021-11-12 05:33:45

WiFi輻射無(wú)線路由器

2018-12-19 13:45:56

Hive實(shí)踐存儲(chǔ)

2019-04-02 09:05:41

微軟開源Windows

2021-02-22 17:00:31

Service Mes微服務(wù)開發(fā)

2020-02-19 14:51:15

程序系統(tǒng)工程師

2010-10-22 17:33:02

2012-05-30 15:03:43

ibmdw
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)