多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
生成联合主键有如下几种方法。 [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]提醒:该方法做不到将实体类自身也可以作为主键类。