在实现兑换码功能时,除了礼包配置表外还需要一个记录批次信息的表。

但这个表比较特殊,他是有两个字段构成的主键,这就是今天要说复合主键,就是把两个字段先封装成一个对象后作为复合主键使用。

复合主键

  1. 需要标注@Embeddable注解
  2. 要有hashCode和equals实现.
  3. 实现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
}

实体类

  1. 不要使用@Id,而是使用@EmbeddedId
  2. 其他同普通单一主键配置

/**
 * 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
}

数据访问接口

  1. 本身就是一个接口
  2. 需要继承JpaRepository接口,参数Key就是复合主键类
  3. 复制主键单一查询 By后是实体类的中的主键字段再跟上复合主健中的字段

@Repository
public interface CdkeyBatchRepository extends JpaRepository<CdkeyBatch, CdkeyBatchPK> {

	// 在批次表中以礼包ID查询分页结果.
	Page<CdkeyBatch> findAllByIdPId(int pid, Pageable page);
}

分页查询

  1. 以礼包ID为条件
  2. 一页显示12条
  3. 结果以创建时间倒序.

Page<CdkeyBatch> batchs = cdkeyBatchRepository.findAllByIdPId(pid, new PageRequest(page, PageConstant.MAX_SIZE, new Sort(Sort.Direction.DESC, "createTime")));

转载请注明原地址: http://blog.noark.xyz/article/2017/8/14/jpa之复合主键/