生成联合主键有如下几种方法。
[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多表查询
- 只查询指定字段
- 级联操作
- 加载规则