生成聯合主鍵有如下幾種方法。
[TOC]
# 1. `@IdClass`與`@Id`組合
**1. 創建一個主鍵類**
```java
/**
* 必須實現接口 Serializable
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AccountId implements Serializable {
/* 下面是將要作為主鍵的屬性,屬性名必須與Account中的一致 */
private String username;
private String password;
private Date createTime;
}
```
**2. 使用注解`@IdClass`將主鍵類引入到當前實體類中并在對應的字段標注注解`@Id`**
```java
@Data
@Entity
@Table(name = "account")
@IdClass(AccountId.class)
@NoArgsConstructor
@AllArgsConstructor
public class Account {
@Id
@Column(name = "username")
private String username;
@Id
@Column(name = "password")
private String password;
@Id
@Column(name = "create_time")
private Date createTime;
@Column(name = "alia_name")
private String aliaName;
@Column(name = "is_delete")
private Boolean isDelete;
}
```
**3. 接口的主鍵類型為定義的主鍵類**
```java
public interface AccountRepository extends JpaRepository<Account, AccountId>
, JpaSpecificationExecutor<Account> {
}
```
>[warning]提醒:也可以不用另起一個類作為主鍵類,實體類自身也可以作為主鍵類。只需要將上面代碼中所有的 AccountId 替換成 Account 即可。
<br/>
# 2. `@Embeddable`與`@EmbeddedId`組合
**1. 創建一個主鍵類**
```java
@Data
@Embeddable //1. 標記注解@Embeddable
@NoArgsConstructor
@AllArgsConstructor
//2. 必須實現接口Serializable
public class CompanyId implements Serializable {
/* 這里定義的屬性將會對應到表中 */
@Column(name = "name")
private String name;
@Column(name = "boss")
private String boss;
}
```
**2. 實體類中引入主鍵類**
```java
@Data
@Entity
@Table(name = "company")
@NoArgsConstructor
@AllArgsConstructor
public class Company {
/** 標記注解@EmbeddedId引入主鍵類 */
@EmbeddedId
private CompanyId companyId;
@Column(name = "local")
private String local;
}
```
**3. 接口主鍵類型為定義的主鍵類**
```java
public interface CompanyRepository extends JpaRepository<Company, CompanyId>
, JpaSpecificationExecutor<Company> {
}
```
>[warning]提醒:該方法做不到將實體類自身也可以作為主鍵類。
- MapStruct屬性映射
- MapStruct是什么
- maven依賴
- 基本映射
- 字段名不一致的映射
- 字段類型不一致的映射
- 基本數據類型轉換
- 日期格式轉換
- 使用表達式轉換
- 枚舉映射
- 多個源類的映射
- 集合的映射
- 添加自定義映射方法
- 映射前后
- 添加默認值
- 映射異常處理
- SpringDataJPA
- SpringDataJPA是什么
- 與JPA、Hibernate的關系
- 環境搭建
- 簡單CURD操作
- 內部原理
- 主鍵生成策略
- 聯合主鍵
- 查詢方式
- 方法命名規則查詢
- 限制查詢結果查詢
- 注解@Query查詢
- 命名參數查詢
- SpEL表達式查詢
- 原生查詢
- 更新與刪除
- Specification動態查詢
- 核心接口
- 查詢例子
- 分頁查詢與排序
- 多表查詢
- 一對一查詢
- 一對多查詢
- 多對多查詢
- 注意事項
- Specification多表查詢
- @Query多表查詢
- 只查詢指定字段
- 級聯操作
- 加載規則