關聯關係
添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
編寫配置文件
#數據源配置數據源配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
#配置JPA
#設置方言
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
#是否控制檯打印SQL語句
spring.jpa.show-sql=true
#自動生成策略,包括create、create-drop、update、none、validate
spring.jpa.hibernate.ddl-auto=update
#配置對應數據庫
spring.jpa.database=mysql
#設置命名策略
#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
類關係
一對一、一對多、多對一、多對多
@OneToOne
一對一
一個人對應一個身份證(別擡槓新舊身份證)
建立實體類
用戶類
import javax.persistence.*;
@Entity
@Table(name = "userinfo")
public class UserInfo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "userId")
private Integer userId;
@Column(length = 30)
private String userName;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "cardId",
referencedColumnName = "cardId")
private Card card;
//省略getter setter
}
身份類
import javax.persistence.*;
@Entity
@Table(name = "card")
public class Card {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer cardId;
@Column(length = 50)
private String place;
//省略getter setter
}
Cascade:級聯操作
CascadeType.ALL:所有的級聯操作(增刪改查[CRUD])
CascadeType.DETECH:將另一方一同設置爲遊離狀態
CascadeType.MERGE\REFRESH:代表更新操作
CascadeType.DELETE:刪除
Fetch:加載策略
FetchType.EAGER:即時獲取
FetchType.LAZY:延遲加載(什麼時候使用,什麼時候加載,有可能會跑出no session異常。)
編寫dao
import com.ry.jpademo.domain.UserInfo;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface UserInfoRepository extends JpaRepository<UserInfo, Integer> {
}
@OneToMany
一對多
班級對學生
新建實體類
班級類
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "grade")
public class Grade {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer gradeNo;
@Column(length = 10)
private String gradeName;
//設置一對多關係 級聯關係設置新增、更新
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
//JoinColumn代表着建立外鍵關係。如果該項不存在,在JPA中,會建立第三張主外鍵維護表。
@JoinColumn(name = "studentNo")
private Set<Student> students = new HashSet<>();
//省略getter setter
}
@ManyToOne
多對一
學生對班級
新建實體類
學生類
import javax.persistence.*;
@Entity
@Table(name ="student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer studentNo;
private String studentName;
//設置多對一關係
//在多的一方,儘量不要設置級聯保存和刪除。
@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH})
//JoinColumn在設置時,如果有雙向關係,該鍵的名稱必須與一的一方的名稱要一致!
@JoinColumn(name = "gradeNo")
private Grade grade;
//省略getter setter
}
@ManyToMany
多對多
一個項目組有多個程序員,一個程序員屬於多個項目
會生成第三個表
新建實體類
項目類
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table
public class Program {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer programNO ;
private String programName ;
/**
* 建立多對多關係
*/
@ManyToMany(mappedBy = "programs",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
private Set<Programmer> programmers = new HashSet<>() ;
//省略getter setter
}
程序員類
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table
public class Programmer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer programmerId ;
private String programmerName ;
@ManyToMany
private Set<Program> programs = new HashSet<>() ;
//省略getter setter
}
最終數據庫的生成結果