## 使用场景:
> 需要用多列数据来标识唯一主键。
### @IdClass:
**创建一个主键类:**
```Java
@Getter
@Setter
@EqualsAndHashCode
public class UserPk implements Serializable {
private String phoneNo;
private String userName;
}
```
<br>
**数据实体类:**
```Java
@Getter
@Setter
@Entity
@IdClass(UserPk.class)
public class User {
@Column(name = "id", updatable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Id
private String userName;
@Id
private String phoneNo;
private String fullName;
}
```
<br>
**Repository类:**
```Java
public interface UserRepository extends Repository<User, UserPk> {
}
```
<br>
------------
### @EmbeddedId
**创建一个主键类:**
```Java
@Getter
@Setter
@EqualsAndHashCode
@Embeddable
public class UserKey implements Serializable {
private String phoneNo;
private String userName;
}
```
<br>
**数据实体类:**
```Java
@Getter
@Setter
@Entity
public class User {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false)
private Integer id;
@EmbeddedId
private UserKey userKey;
private String fullName;
}
```
<br>
**Repository类:**
```Java
public interface UserRepository extends Repository<User, UserKey> {
}
```
<br>
------------
**注意:**
1. 主键类需要实现Serializable
2. 主键类需要重写equals和hashCode方法
3. 主键类需要有get/set方法
4. 主键的顺序即是主键类中的顺序,跟数据实体类中的顺序无关
------------
### WARNING
spring-boot 2.1.4版本之前,同时使用@IdClass和@Query会产生“validation failed for query for method”的异常!解决方法是:
1. 升级到2.1.4及之后的版本
2. 使用@EmbeddedId
PS:这个问题太坑了,找了好久都没找到解决方法。网上也没啥解决方案。各种怀疑是不是哪里写错了。哭晕了。
JPA中的@IdClass和@EmbeddedId