You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:32:08