精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Jpa 中怎么玩一對多?

開發 前端
Jpa 中的一對一、一對多沒搞明白的話,總會覺得有點繞,今天咱們來簡單聊聊這個話題。

Jpa 中的一對一、一對多沒搞明白的話,總會覺得有點繞,今天咱們來簡單聊聊這個話題。

1. 一對一

比如說一個學校有一個地址,一個地址只有一個學校。

那么我們可以按照如下方式來設計類:

@Data
@Entity
@Table(name = "t_address")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer aid;
private String province;
private String city;
private String area;
private String phone;
@OneToOne(cascade = CascadeType.ALL)
private School school;
}
@Data
@Entity
@Table(name = "t_school")
public class School {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer sid;
private String name;
@OneToOne(cascade = CascadeType.ALL)
private Address address;
}

一對一的關系,可以只在 School 中維護,也可以只在 Address 中維護,也可以兩者都維護,具體哪種,那就看需求了。

在上面的例子中,我們在 School 和 Address 中都通過 @OneToOne 注解來維護了一對一的關系。

cascade 用來配置級聯操作,有如下取值:

  • ALL:所有操作
  • PERSIST:級聯添加
  • MERGE:級聯更新
  • REMOVE:級聯刪除
  • REFRESH:級聯刷新

根據自己需求選擇合適的就行。

這樣,最終創建出來的 t_school 表和 t_address 表中,會分別多出來一個字段 address_aid 和 school_sid,這兩個字段都是外鍵,正是通過外鍵,將兩張表中不同的記錄關聯起來。

有的人可能不習慣這種自動添加的字段,那也可以自定義該字段,反正該字段總是要有的,自定義的方式如下:

@Data
@Entity
@Table(name = "t_address")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer aid;
private String province;
private String city;
private String area;
private String phone;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "sid",referencedColumnName = "sid")
private School school;
@Column(insertable = false,updatable = false)
private Integer sid;
}
@Data
@Entity
@Table(name = "t_school")
public class School {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer sid;
private String name;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "aid",referencedColumnName = "aid")
private Address address;
@Column(insertable = false,updatable = false)
private Integer aid;
}

在 Address 中自定義一個 sid,并設置該字段不可添加和修改,然后通過 @JoinColumn 注解去指定關聯關系,@JoinColumn 注解中的 name 表示的是當前類中的屬性名,referencedColumnName 表示的則是 School 類中對應的屬性名。

在 School 類中做相似的操作。

最后啟動項目去觀察 MySQL 中生成的表。

2. 一對多

一個班級中有多個學生,而一個學生只屬于一個班級,我們可以這樣來定義實體類:

@Data
@Table(name = "t_student")
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer sid;
private String name;
@ManyToOne(cascade = CascadeType.ALL)
private Clazz clazz;
}
@Data
@Table(name = "t_clazz")
@Entity
public class Clazz {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer cid;
private String name;
@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
private List<Student> students;
}

Student 和 Clazz 的關系是多對一,用 @ManyToOne 注解,Clazz 和 Student 的關系是一對多,用 @OneToMany 注解。

Student 和 Clazz 的關系是多對一,將來的 t_student 表中會多出來一個屬性 clazz_cid,通過這個外鍵將 Student 和 Clazz 關聯起來。如果我們不想要自動生成的 clazz_cid,那么也可以自定義,方式如下:

@Data
@Table(name = "t_student")
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer sid;
private String name;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "cid")
private Clazz clazz;
@Column(insertable = false,updatable = false)
private Integer cid;
}

定義一個 cid 屬性,并設置為不可編輯和不可添加,然后通過 @JoinColumn 注解配置 cid 屬性為外鍵。

Clazz 和 Student 的關系是一對多,這個是通過一個自動生成的第三張表來實現的,如下:

3. 測試

3.1 添加測試

先來個一對一的添加測試,如下:

public interface SchoolRepository extends JpaRepository<School,Integer> {
}
@SpringBootTest
class JpaOneToManyApplicationTests {

@Autowired
SchoolRepository schoolRepository;
@Test
void contextLoads() {
School school = new School();
school.setSid(1);
school.setName("哈佛大學");
Address address = new Address();
address.setAid(1);
address.setProvince("黑龍江");
address.setCity("哈爾濱");
address.setArea("某地");
address.setPhone("123456");
school.setAddress(address);
schoolRepository.save(school);
}

}

在這個測試過程中,關聯關系是由 t_school 一方來維護了,因此將來填充的外鍵是 t_school 中的 aid。添加結果如下圖:

t_school

t_address

這是一個簡單的添加案例。

更新也是調用 save 方法,更新的時候會先判斷這個 id 是否存在,存在的話就更新,不存在就添加。

再來看班級的添加,如下:

public interface ClazzRepository extends JpaRepository<Clazz,Integer> {
}
@Autowired
ClazzRepository clazzRepository;
@Test
void test02() {
Clazz c = new Clazz();
c.setCid(1);
c.setName("三年級二班");
List<Student> students = new ArrayList<>();
Student s1 = new Student();
s1.setSid(1);
s1.setName("javaboy");
students.add(s1);
Student s2 = new Student();
s2.setSid(2);
s2.setName("張三");
students.add(s2);
c.setStudents(students);
clazzRepository.save(c);
}

注意,添加的是班級,所以班級和學生之間關系就由第三張表來維護,而不是由學生來維護。

3.2 查詢測試

再來一個簡單的查詢,假設我們現在想根據省份來搜索學校,如下:

public interface SchoolRepository extends JpaRepository<School,Integer> {
List<School> findSchoolByAddressProvince(String province);
}
@Autowired
SchoolRepository schoolRepository;
@Test
void test01() {
List<School> list = schoolRepository.findSchoolByAddressProvince("黑龍江");
System.out.println("list = " + list);
}

松哥給大家捋一下 Spring Data 如何解析上面自定義的查詢方法:

  • 首先截取掉 findSchoolByAddressProvince 的前綴,剩下 AddressProvince。
  • 檢查 School 是否有 addressProvince 屬性,有就按照該屬性查詢,對于我們的案例,并沒有 addressProvince 屬性,所以繼續下一步。
  • 從右側駝峰開始拆分,拆掉第一個駝峰后面的內容,我們這里拆分之后只剩下 Address 了,判斷 School 是否存在 Address 屬性,不存在就繼續重復該步驟,繼續切掉右側第一個駝峰。
  • 在上文案例中,School 中有 address 屬性,所以接下來就去檢查 address 中是否有 province 屬性,因為我們這里只剩下一個 province 了,如果剩下的字符串類似于 provinceAaaBbb 這種,那么繼續按照第三步去解析。

上面這個寫法有一個小小的風險,假設 School 中剛好就有一個屬性叫做 addressProvince,那么此時的分析就會出錯。所以,對于上面的查詢,我們也可以定義成如下方式:

public interface SchoolRepository extends JpaRepository<School,Integer> {
List<School> findSchoolByAddress_Province(String province);
}

此時就不會產生歧義了,系統就知道 province 是 address 的屬性了。

再來一個班級的查詢,如下:

public interface ClazzRepository extends JpaRepository<Clazz,Integer> {
}
@Test
void test03() {
List<Clazz> list = clazzRepository.findAll();
System.out.println("list = " + list);
}

如果在查詢的過程中,需要對學生進行排序,可以添加如下屬性:

@Data
@Table(name = "t_clazz")
@Entity
public class Clazz {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer cid;
private String name;
@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@OrderBy("sid desc")
private List<Student> students;
}

通過 @OrderBy("sid desc") 可以設置查詢的 student 排序。


責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2009-06-04 16:14:22

Hibernate一對Hibernate一對Hibernate多對

2009-09-22 09:55:58

Hibernate實例

2009-07-21 17:31:39

iBATIS一對多映射

2010-04-15 09:09:02

Hibernate

2023-06-12 08:09:01

FlaskSQLAlchemy

2020-02-12 11:34:56

架構平滑上云機房遷移

2011-03-25 10:49:30

Join一對多

2010-07-07 08:33:09

SQL Server學

2020-06-23 14:28:24

MySQL商品數據

2009-06-24 15:51:47

Entity Bean一對多映射

2012-03-21 11:43:41

JavaHibernate

2022-10-08 11:40:18

Receive阻塞Trigger

2009-06-04 10:34:19

Hibernate一對一對多關系配置

2009-06-03 16:27:27

Hibernate一對一關系

2009-06-03 16:18:16

Hibernate關系代碼實例

2012-02-08 13:34:08

HibernateJava

2019-05-12 14:10:07

物聯網DDOS網絡攻擊

2009-08-17 10:34:51

NHibernate一

2009-06-26 10:15:54

面試HR

2009-09-23 10:37:50

Hibernate一對
點贊
收藏

51CTO技術棧公眾號

久久视频一区二区三区| 日韩小视频在线播放| 国产精品嫩草影院精东| 亚洲激情久久| 精品国产乱码久久久久久闺蜜| 国产特级黄色大片| 毛片网站在线免费观看| 国产 欧美在线| 国产成人精品av在线| 天天操天天操天天操天天操天天操| 国产成人在线中文字幕| 欧美亚洲高清一区二区三区不卡| 黄色污污在线观看| 少妇喷水在线观看| 国内精品久久久久影院薰衣草| 久久男人av资源网站| 国产探花视频在线播放| 国产精品玖玖玖在线资源| 欧美色倩网站大全免费| 91黄色在线看| 九七久久人人| 欧美高清在线精品一区| 国产aⅴ精品一区二区三区黄| 天天干,天天干| 欧美日本精品| www.午夜精品| 无码 人妻 在线 视频| 99re6热在线精品视频播放速度| 日本精品在线免费观看| 日韩a级大片| 欧美一级久久久| 91蝌蚪视频在线观看| 成人国产电影在线观看| 亚洲欧美成人一区二区三区| 色一情一区二区三区四区| 日韩一卡二卡在线| 成人午夜av电影| 51精品国产人成在线观看| 国产美女www| 乱码第一页成人| 91精品国产高清自在线 | 一区二区三区日本视频| 在线观看www91| 久久久免费视频网站| 国内在线视频| 亚洲精品国产成人久久av盗摄| 亚洲国产精品一区二区第四页av| 青青草视频在线免费观看| 成人性生交大片免费| 97人人模人人爽人人喊38tv| 97精品人妻一区二区三区| 日韩高清不卡在线| 国产精品999| 国产99免费视频| 视频一区欧美日韩| 国产精彩精品视频| 中国a一片一级一片| 首页国产欧美日韩丝袜| 欧美影院久久久| 老熟妇仑乱一区二区av| 亚洲一区二区三区高清| 欧美专区福利在线| 好吊色在线视频| 免费一级欧美片在线观看| 国产精品第一区| 人妻中文字幕一区二区三区| 免费不卡在线观看| 国产日韩av在线播放| 国产丝袜在线视频| 成人综合婷婷国产精品久久蜜臀| 国产三区二区一区久久| 无码精品人妻一区二区| 久久蜜桃av一区二区天堂| 色一情一乱一伦一区二区三区丨 | 免费视频亚洲| 国产一区二区久久精品| 久久成人小视频| 欧美二区不卡| 5566成人精品视频免费| 这里只有精品国产| 国产乱对白刺激视频不卡| 国产一区二区免费在线观看| 青青草超碰在线| 国产精品久久久久久久久图文区| 青青草原网站在线观看| а√天堂资源官网在线资源| 色综合久久66| 亚洲欧美日本一区二区| 成人h动漫精品一区二区器材| 日韩av影院在线观看| 91资源在线播放| 欧美国内亚洲| 欧美中文字幕在线观看| 97在线视频人妻无码| 成人中文字幕合集| 日韩中文字幕一区二区| 日本乱理伦在线| 色婷婷综合久久久久中文一区二区| 午夜在线观看av| 粉嫩av一区二区| 一本色道久久88综合日韩精品| 亚洲不卡在线播放| 久久xxxx精品视频| 91探花福利精品国产自产在线| 日韩在线观看视频一区| 国产精品乱人伦| 大肉大捧一进一出好爽视频| 亚洲欧洲专区| 亚洲天堂av综合网| 免费一级肉体全黄毛片| 美日韩一级片在线观看| 久久亚洲高清| 在线看三级电影| 欧美系列在线观看| 呦呦视频在线观看| 91精品国产91久久久久久密臀 | 欧美一级视频免费观看| 久久成人免费网站| 欧美日韩综合另类| bl在线肉h视频大尺度| 欧美日韩成人综合| 亚洲区免费视频| 日韩网站在线| 亚洲一区二区自拍| 在线观看免费黄色| 色婷婷av一区二区三区大白胸| 中国男女全黄大片| 久久社区一区| 国产精品视频午夜| 久久久久国产精品嫩草影院| 亚洲成人自拍网| 自拍一级黄色片| 91久久夜色精品国产按摩| 日韩av片电影专区| 日韩av地址| 黄色成人av网| 亚洲色偷偷色噜噜狠狠99网| 亚洲xxx拳头交| 国产在线高清精品| av在线中文| 欧美亚洲国产一区二区三区va| 国产美女免费无遮挡| 亚洲永久免费视频| 免费看av软件| 全球中文成人在线| 自拍偷拍亚洲区| 在线观看你懂的网站| 久久日韩粉嫩一区二区三区| 久久综合九色综合88i| 国产66精品| 午夜精品美女自拍福到在线| 黄色一级大片在线免费看国产一| 一区二区在线看| 精品人妻无码中文字幕18禁| 亚洲一区二区| 91中文字精品一区二区| 9191在线播放| 亚洲精品在线观看视频| 日本免费观看视| 成人福利视频网站| 日韩国产欧美亚洲| 久久综合亚洲| 国产精品福利在线观看| 色三级在线观看| 6080午夜不卡| 老女人性淫交视频| 成人在线视频一区二区| www..com日韩| 精品在线手机视频| 国产精品免费看久久久香蕉| 午夜毛片在线| 欧美一级二级三级乱码| 久久久久成人网站| 97久久精品人人澡人人爽| 毛片av免费在线观看| 成人黄色av| 91精品黄色| 亚洲美女炮图| 久久国产一区二区三区| www黄色网址| 欧美性极品xxxx做受| 天天摸日日摸狠狠添| 国产一区在线看| 日韩av三级在线| 不卡视频在线| 国产66精品久久久久999小说| 欧美久久天堂| 久久久国产精品x99av| 高潮一区二区三区乱码| 色婷婷久久久久swag精品| 一本色道久久88| 不卡高清视频专区| 男女视频在线看| 亚洲高清在线| 亚洲综合网中心| 欧美三级午夜理伦三级在线观看| 国产精品久久久久久av下载红粉 | 久久男人资源视频| 91吃瓜网在线观看| 亚洲第一av在线| 五月激情丁香网| 亚洲高清久久久| 国产麻豆a毛片| 99国内精品久久| 污污的视频免费观看| av成人天堂| 三年中文高清在线观看第6集| 欧美巨大xxxx| 91黄色精品| 日韩精品一级毛片在线播放| 91国偷自产一区二区三区的观看方式| 婷婷成人激情| 亚洲毛片在线观看| 成人午夜精品福利免费| 欧美色成人综合| 一级片中文字幕| 国产精品国产自产拍在线| 男生裸体视频网站| 国产盗摄一区二区三区| 亚洲视频第二页| 久久三级视频| 欧美爱爱视频免费看| 欧美a级片一区| 欧美aaa在线观看| 视频国产一区| 黑人另类av| 99国产精品免费网站| 国产欧美日韩中文字幕在线| 欧美18—19sex性hd| 97久久久免费福利网址| 超碰在线caoporn| 综合网日日天干夜夜久久| 天堂在线视频网站| 精品国产一区二区三区久久久蜜月| 一炮成瘾1v1高h| 欧美在线观看视频一区二区三区| 日本在线播放视频| 午夜私人影院久久久久| 成人免费看片98| 亚洲视频在线观看一区| 久久嫩草捆绑紧缚| 国产精品久久久久精k8| 91香蕉国产视频| 国产精品福利一区二区三区| 极品人妻videosss人妻| 国产视频一区二区在线| av男人的天堂av| 国产欧美中文在线| 精品成人无码一区二区三区| 国产欧美一区二区精品婷婷| 国产 欧美 在线| 中文字幕乱码日本亚洲一区二区| 51妺嘿嘿午夜福利| 中日韩av电影| 肉色超薄丝袜脚交69xx图片 | 亚洲精品在线观看av| 亚洲尤物在线视频观看| 日韩美女黄色片| 欧美特级www| 欧美日韩在线视频播放| 欧美视频你懂的| 国产麻豆免费视频| 精品久久人人做人人爽| 日本波多野结衣在线| 日韩精品在线看| 国产一区二区三区福利| 在线精品91av| 国产成人l区| 久久人人爽人人爽人人片av高清| a√中文在线观看| 日韩av电影中文字幕| 欧美成a人片免费观看久久五月天| 成人信息集中地欧美| 91麻豆精品激情在线观看最新 | 国产精品色婷婷视频| 91精品网站在线观看| av在线不卡一区| 日韩美脚连裤袜丝袜在线| 日韩在线电影一区| 中文av一区| 好吊妞无缓冲视频观看| 日韩制服丝袜先锋影音| 国产探花在线观看视频| av中文字幕亚洲| 手机看片日韩av| 亚洲狠狠丁香婷婷综合久久久| 日韩精品一区二区不卡| 欧美在线综合视频| www.蜜臀av| 亚洲人午夜精品| 99视频免费在线观看| 欧美野外猛男的大粗鳮| 日韩三级成人| 激情欧美一区二区三区中文字幕| 精品国产91| 男人的天堂avav| 免费日本视频一区| 欧美做受高潮中文字幕| 国产精品无圣光一区二区| 国产亚洲精品久久久久久打不开| 色综合天天视频在线观看| 97人妻一区二区精品免费视频| 亚洲精品福利免费在线观看| 日本电影全部在线观看网站视频| 欧美极品少妇xxxxⅹ喷水| 欧美不卡高清一区二区三区| av在线不卡一区| 日韩中文欧美| 成熟了的熟妇毛茸茸| 国产一区二区三区免费看| 性欧美精品中出| 亚洲一级不卡视频| 国产又粗又猛又黄| 亚洲欧洲xxxx| a级片免费在线观看| 91久久久久久| 国产一区二区三区四区二区| www.国产在线视频| 国产一区二三区好的| 非洲一级黄色片| 欧美日韩国产页| 懂色av成人一区二区三区| 日韩性xxxx爱| 国产v综合v| 久久国产手机看片| 尤物在线精品| 制服.丝袜.亚洲.中文.综合懂| 中文字幕av一区二区三区免费看| 综合激情网五月| 精品久久免费看| 91小视频xxxx网站在线| 国产精品专区第二| 国产免费播放一区二区| 免费无码av片在线观看| 成人av在线一区二区三区| avove在线播放| 欧美一区二区视频观看视频| 99视频在线观看地址| 国产成人一区二区| 成人动态视频| 奇米精品一区二区三区| 成人av在线一区二区三区| 日本三级网站在线观看| 欧美变态tickle挠乳网站| 在线三级中文| 俄罗斯精品一区二区| 极品裸体白嫩激情啪啪国产精品| 久久久久亚洲av无码专区首jn| 中文字幕一区免费在线观看| 中文字幕第2页| 久久精品小视频| 精品国产一区二区三区性色av| 9l视频自拍9l视频自拍| 韩国女主播成人在线观看| 日韩女优一区二区| 欧美一卡2卡3卡4卡| 欧美videosex性极品hd| 亚洲综合精品一区二区| 精品色999| 91亚洲精品久久久蜜桃借种| 国产精品久久久99| 国产高潮流白浆喷水视频| 欧美高清自拍一区| 精品亚洲免a| 国产精品永久免费在线| 国产又粗又猛又爽| 久久精品国产清自在天天线| 国产视频一区二区在线播放| 无码人妻精品一区二区蜜桃百度| 岛国av在线一区| 日本视频网站在线观看| 这里只有精品在线观看| 亚洲精品自拍| 久久亚洲国产成人精品无码区 | 亚洲va国产va天堂va久久| 国内综合精品午夜久久资源| 影音先锋黄色资源| 欧美在线综合视频| 91麻豆免费在线视频| 久久久99爱| 美腿丝袜亚洲三区| 国产午夜精品无码| 国产亚洲欧洲高清| 国产一区二区三区视频在线| 拔插拔插海外华人免费| 久久男人中文字幕资源站| 国产又黄又大又爽| 97久久精品人人澡人人爽缅北| 成人嫩草影院| 久久人妻少妇嫩草av蜜桃| 在线亚洲免费视频| 天天干在线视频论坛| 日本视频精品一区| 高清国产午夜精品久久久久久| 日韩综合在线观看| 欧美另类精品xxxx孕妇| 成人在线亚洲| 国产伦精品一区二区三区88av| 欧美体内she精视频| 免费看电影在线|