在实现兑换码功能时,除了礼包配置表外还需要一个记录批次信息的表。
但这个表比较特殊,他是有两个字段构成的主键,这就是今天要说复合主键,就是把两个字段先封装成一个对象后作为复合主键使用。
复合主键
- 需要标注@Embeddable注解
- 要有hashCode和equals实现.
- 实现Serializable接口
/**
* 批次表的复合主键.
*/
@Embeddable
public class CdkeyBatchPK implements Serializable {
@Column(name = "pid", nullable = false)
private int pid;// 礼包ID.
@Column(name = "bid", nullable = false)
private int bid;// 批次ID
... get set
... hashCode equals
}
实体类
- 不要使用@Id,而是使用@EmbeddedId
- 其他同普通单一主键配置
/**
* CDKEY批次表实体类.
*/
@Entity
@Table(name = "cdkey_batch")
public class CdkeyBatch {
@EmbeddedId
private CdkeyBatchPK id;
@Column(name = "count", nullable = false)
private int count;// 本批次生成的数量
@Column(name = "remaining", nullable = false)
private int remaining;// 剩余的数量
@Column(name = "sync_time", nullable = false)
private Date syncTime;// 剩余的数量同步时间
@Column(name = "create_time", nullable = false)
private Date createTime;
@Column(name = "modify_time", nullable = false)
private Date modifyTime;
... get set
}
数据访问接口
- 本身就是一个接口
- 需要继承JpaRepository接口,参数Key就是复合主键类
- 复制主键单一查询 By后是实体类的中的主键字段再跟上复合主健中的字段
@Repository
public interface CdkeyBatchRepository extends JpaRepository<CdkeyBatch, CdkeyBatchPK> {
// 在批次表中以礼包ID查询分页结果.
Page<CdkeyBatch> findAllByIdPId(int pid, Pageable page);
}
分页查询
- 以礼包ID为条件
- 一页显示12条
- 结果以创建时间倒序.
Page<CdkeyBatch> batchs = cdkeyBatchRepository.findAllByIdPId(pid, new PageRequest(page, PageConstant.MAX_SIZE, new Sort(Sort.Direction.DESC, "createTime")));