Springboot?JPA級聯(lián)操作的實現(xiàn)(一對一、一對多、多對多)
自從接觸了JPA,就對立面的級聯(lián)操作很費解,特此做一下學(xué)習(xí)。JPA提供的Entity級聯(lián)可以建立一對一、一對多、多對多的關(guān)系,覆蓋查詢、保存、刷新、刪除等操作。
(1)一對一,@OneToOne
TUser與TGender成一對一關(guān)系
@Entity @Data @Table(name = "user",schema = "hr") @JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"}) @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") @GenericGenerator(name = "jpa-uuid", strategy = "uuid") public class TUser { @Id @GeneratedValue(generator="jpa-uuid") @Column(name = "user_id") private String id; @Column(name = "user_name") private String name; @Column(name = "user_describe") private String desc; //@JoinColumn的name指的是當(dāng)前表user的字段gender_id,referencedColumnName指關(guān)聯(lián)表gender的字段id @OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST,CascadeType.REMOVE,CascadeType.ALL}) @JoinColumn(name = "gender_id",referencedColumnName = "id") private TGender genderId; }
而TGender為:
@Entity @Data @Table(name = "gender",schema = "hr") @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") @JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"}) public class TGender { @Id @GenericGenerator(name = "jpa-uuid", strategy = "uuid") private String id; private String sex; //可維護可不維護,mappedBy就是被維護端,被TUser類中的屬性“genderId”維護 @OneToOne(mappedBy = "genderId", cascade = {CascadeType.MERGE, CascadeType.REFRESH}, optional = false) private TUser tUser;
(2)一對多,@OneToMany 和 @ManyToOne
兩個是一起用的,以Company和User為例子,一個公司有多個職工
@Entity @Data @Table(name = "user",schema = "hr") @JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"}) @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") @GenericGenerator(name = "jpa-uuid", strategy = "uuid") public class TUser { @Id @GeneratedValue(generator="jpa-uuid") @Column(name = "user_id") private String id; @Column(name = "user_name") private String name; @Column(name = "user_describe") private String desc; @OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST,CascadeType.REMOVE,CascadeType.ALL}) @JoinColumn(name = "gender_id",referencedColumnName = "id") private TGender genderId; //@JoinColumn的name指的是當(dāng)前表user的字段company_id,referencedColumnName指關(guān)聯(lián)表company的字段id @ManyToOne(cascade = {CascadeType.ALL}) @JoinColumn(name = "company_id",referencedColumnName = "id") private TCompany companyId; }
TCompany 為:
@Entity @Data @Table(name = "company",schema = "hr") @JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"}) @GenericGenerator(name = "jpa-uuid", strategy = "uuid") public class TCompany { @Id @GeneratedValue(generator="jpa-uuid") private String id; private String name; //查詢時建議把userList忽略 //可維護可不維護,mappedBy就是被維護端,被TUser類中的屬性“companyId”維護 @OneToMany(mappedBy="companyId",cascade = {CascadeType.ALL}) private List<TUser> userList; }
(3)多對多,@ManyToMany
已TUser和TRole為例子
@Entity @Data @Table(name = "user",schema = "hr") @JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"}) @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") @GenericGenerator(name = "jpa-uuid", strategy = "uuid") public class TUser { @Id @GeneratedValue(generator="jpa-uuid") @Column(name = "user_id") private String id; @Column(name = "user_name") private String name; @Column(name = "user_describe") private String desc; //使用JoinTable屬性把中間表關(guān)聯(lián)起來,中間表主鍵為自增,joinColumns指的當(dāng)前表user,name 屬性指向中間表的user_id,referencedColumnName 指向user中的id,inverseJoinColumns是role表,name 屬性指向中間表的role_id,referencedColumnName 指向role中的id @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST,CascadeType.REMOVE}) @JoinTable(name = "user_role", schema = "hr", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")) private List<TRole> roleSet = new ArrayList<>(); }
TRole為:
@Entity @Data @Table(name = "role",schema = "hr") @GenericGenerator(name = "jpa-uuid", strategy = "uuid") public class TRole { @Id @GeneratedValue(generator="jpa-uuid") private String id; private String name; @Column(name = "role_desc") private String desc; //mappedBy就是被維護端,被TUser類中的屬性“roleSet”維護 @ManyToMany(mappedBy = "roleSet",cascade = {CascadeType.PERSIST,CascadeType.REMOVE}) private List<TUser> userSet = new ArrayList<>(); }
依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <!-- Compile --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- config --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- Test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> </dependencies>
到此這篇關(guān)于Springboot JPA級聯(lián)操作的實現(xiàn)(一對一、一對多、多對多)的文章就介紹到這了,更多相關(guān)Springboot JPA級聯(lián)操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot + jpa實現(xiàn)刪除數(shù)據(jù)的操作代碼
- Spring?Boot?整合JPA?數(shù)據(jù)模型關(guān)聯(lián)使用操作(一對一、一對多、多對多)
- SpringDataJPA詳解增刪改查操作方法
- Spring?Data?JPA映射自定義實體類操作
- SpringDataJpa多表操作的實現(xiàn)
- Springboot使用Spring Data JPA實現(xiàn)數(shù)據(jù)庫操作
- SpringBoot集成JPA持久層框架,簡化數(shù)據(jù)庫操作
- springboot-jpa的實現(xiàn)操作
- springboot 之jpa高級查詢操作
相關(guān)文章
idea全局設(shè)置Maven配置的實現(xiàn)步驟
本文主要介紹了idea全局設(shè)置Maven配置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Java實現(xiàn)微信公眾號自定義菜單的創(chuàng)建方法示例
這篇文章主要介紹了Java實現(xiàn)微信公眾號自定義菜單的創(chuàng)建方法,結(jié)合實例形式分析了java創(chuàng)建微信公眾號自定義菜單的具體步驟、實現(xiàn)方法及相關(guān)操作注意事項,需要的朋友可以參考下2019-10-10Java 中的 DataInputStream 介紹_動力節(jié)點Java學(xué)院整理
DataInputStream 是數(shù)據(jù)輸入流。它繼承于FilterInputStream。接下來通過本文給大家介紹Java 中的 DataInputStream的相關(guān)知識,需要的朋友參考下吧2017-05-05vscode開發(fā)maven的javaweb項目并部署到tomcat及配置指南
這篇文章主要給大家介紹了關(guān)于vscode開發(fā)maven的javaweb項目并部署到tomcat及配置的相關(guān)資料,在vscode中創(chuàng)建maven項目,需要逐一操作下面的環(huán)節(jié),文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12