【问题标题】:Composite primary key, whats the best way to identify this resource with REST?复合主键,用 REST 识别此资源的最佳方法是什么?
【发布时间】:2020-01-12 01:26:04
【问题描述】:

我有一个实体ProjectEmployee,它代表一个三元关联。它的两个字段EmployeeProject 的组成必须是唯一的:

@Entity
@Data
@IdClass(ProjectEmployeeId.class)
public class ProjectEmployee {

  @Id
  @ManyToOne
  private Project project;

  @Id
  @ManyToOne
  private Employee employee;

  @ManyToOne
  private ProjectEmployeeRole projectEmployeeRole;
}

我正在使用 REST,我想用唯一标识符识别每个资源。我不能为ProjectEmployee 做这件事,因为这个实体没有唯一的标识符。什么是最好的解决方案?我总是需要发送两个参数来识别这个资源吗?

获取:

../projectemployees/{proejctId}/{employeeId}

这将识别资源,但有没有办法只使用一个标识符而不是两个?

【问题讨论】:

  • 我强烈建议使用人工(即用户不可见)主键。
  • 嗯,你的意思是我应该使用 UUID 之类的东西来从应用程序外部识别我的资源吗?所以我可以继续拥有我现在拥有的双主键,只需添加一个唯一列“uuid”,我可以用它来识别静止的资源? ../projectemployees/{uuid} ?
  • 我建议反过来:将UUID 设为主键,将UNIQUE 约束添加到其他两列。老实说,我不确定我是否会通过 REST API 公开这种关系。我建议使用类似 HATEOAS 的方法:让 Employee 返回对他/她参与的项目的引用列表(uris);让项目返回参与项目的员工的引用列表(uris)。

标签: java rest jpa


【解决方案1】:

“REST”并不关心您使用什么作为标识符,只要它符合 RFC 3986 描述的生产规则即可。

/cee03013-7761-465f-a71c-791450c8e785

是一个完全令人满意的 URI。

任何编码到 URI 中的信息都由源服务器自行决定。

任何允许您(服务器)正确地将请求与预期资源及其表示相关联的拼写都是很好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2014-05-12
    • 2014-01-23
    • 2021-06-06
    • 2016-01-30
    • 1970-01-01
    • 2020-05-27
    相关资源
    最近更新 更多