Springboot?JPA級聯(lián)操作的實現(xiàn)(一對一、一對多、多對多)
自從接觸了JPA,就對立面的級聯(lián)操作很費解,特此做一下學習。JPA提供的Entity級聯(lián)可以建立一對一、一對多、多對多的關系,覆蓋查詢、保存、刷新、刪除等操作。
(1)一對一,@OneToOne
TUser與TGender成一對一關系
@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指的是當前表user的字段gender_id,referencedColumnName指關聯(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指的是當前表user的字段company_id,referencedColumnName指關聯(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屬性把中間表關聯(lián)起來,中間表主鍵為自增,joinColumns指的當前表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>
到此這篇關于Springboot JPA級聯(lián)操作的實現(xiàn)(一對一、一對多、多對多)的文章就介紹到這了,更多相關Springboot JPA級聯(lián)操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- springboot + jpa實現(xiàn)刪除數(shù)據(jù)的操作代碼
- Spring?Boot?整合JPA?數(shù)據(jù)模型關聯(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高級查詢操作
相關文章
深入理解JAVA中的聚集和組合的區(qū)別與聯(lián)系
下面小編就為大家?guī)硪黄钊肜斫釰AVA中的聚集和組合的區(qū)別與聯(lián)系。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧2016-05-05
解決idea找不到類could not find artifact問題
本文總結了解決Java項目中找不到類的問題的常見解決方案,包括刷新Maven項目、清理IDEA緩存、Maven Clean Install、重新Package、解決依賴沖突和手動導入依賴包等方法2025-01-01
一文帶你了解SpringBoot中啟動參數(shù)的各種用法
在使用 Spring Boot開發(fā)應用時,我們通常需要根據(jù)不同的環(huán)境或特定需求調整啟動參數(shù),那么,Spring Boot 提供了哪些方式來配置這些啟動參數(shù)呢,下面小編就來和大家介紹一下吧2025-03-03

