Spring Boot应用中请求政策表的主键与关联映射设计咨询
Spring Boot + Hibernate 政策申请模块解决方案
1. 表结构优化与主键设计
首先,你不需要拆分两张请求表,应该合并为一张policy_request表(建议用下划线命名符合数据库规范)——用户申请和管理员审批属于同一个业务流程的不同阶段,拆分两张表只会造成数据冗余和维护麻烦。
主键方案选择:
- 方案一:自增单主键(推荐)
新增request_id作为自增主键(类型用BIGINT AUTO_INCREMENT),这种方式最灵活,支持用户重复申请同一政策(比如撤销后再次申请),后续扩展字段也更方便。 - 方案二:复合主键
如果业务严格禁止用户重复申请同一政策,可以用user_id + policy_id作为复合主键,但需要在Hibernate中用@EmbeddedId或@IdClass实现,缺点是后续若要支持重复申请,必须修改主键结构。
2. 一对多/多对一映射实现
基于合并后的policy_request表,核心映射关系如下:
- User 与 PolicyRequest:一对多(一个用户可提交多个政策申请)
- Policy 与 PolicyRequest:一对多(一个政策可被多个用户申请)
- Admin 与 PolicyRequest:多对一(一个审批操作对应一个管理员)
实体类核心代码示例:
User 实体
@Entity @Table(name = "users") public class User { @Id @Column(name = "user_id") private Long userId; // 其他业务字段... // 一对多关联PolicyRequest @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<PolicyRequest> policyRequests = new ArrayList<>(); // getter、setter }
Policy 实体
@Entity @Table(name = "policy") public class Policy { @Id @Column(name = "policy_id") private Long policyId; // 其他业务字段... // 一对多关联PolicyRequest @OneToMany(mappedBy = "policy", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<PolicyRequest> policyRequests = new ArrayList<>(); // getter、setter }
PolicyRequest 实体(自增主键版本)
@Entity @Table(name = "policy_request") public class PolicyRequest { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "request_id") private Long requestId; // 多对一关联User @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false) private User user; // 多对一关联Policy @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "policy_id", nullable = false) private Policy policy; // 审批相关字段 @Column(name = "approval_status") private String approvalStatus; // 可选值:PENDING、APPROVED、REJECTED @Column(name = "admin_id") private Long adminId; // 关联管理员ID @Column(name = "approval_time") private LocalDateTime approvalTime; @Column(name = "approval_note") private String approvalNote; // getter、setter }
3. 表关联配置说明
- 合并后的
policy_request表通过user_id外键关联users表的user_id,通过policy_id外键关联policy表的policy_id,通过admin_id(可选)关联管理员表(如果有单独的Admin表)。 - 如果原本没有Admin表,若需要记录审批人信息,建议新增
admin表(主键admin_id),然后在PolicyRequest中添加@ManyToOne关联Admin实体即可。 - 不需要额外新增其他表,现有结构优化后完全满足业务需求:用户提交申请时插入
policy_request(状态设为PENDING),管理员审批时更新该记录的状态、审批人、备注等字段。
内容的提问来源于stack exchange,提问作者Diptesh karle
相关产品推荐
相关产品推荐

