一尘不染

无法识别Spring Data REST @Idclass

hibernate

我有一个名为EmployeeDepartment的实体,如下所示

@IdClass(EmployeeDepartmentPK.class) //EmployeeDepartmentPK is a serializeable object
@Entity
EmployeeDepartment{

@Id
private String employeeID;

@Id
private String departmentCode;
---- Getters, Setters and other props/columns
}

我有一个如下定义的Spring Data Repository

@RepositoryRestResource(....)
public interface IEmployeeDepartmentRepository extends PagingAndSortingRepository<EmployeeDepartment, EmployeeDepartmentPK> {

}

此外,我注册了一个转换器,以将String转换为EmployeeDepartmentPK。

现在,对于一个由ID employeeID =“ abc123”和departmentCode =“
JBG”限定的实体,我希望在调用SDR接口时使用的ID为abc123_JBG。例如,http:// localhost /
EmployeeDepartment /
abc123_JBG
应该获取我的结果,确实可以。

但是,当我尝试使用PUT保存实体时,Spring Data
Commons的BasicPersistentEntity类中可用的ID属性的DepartmentCode值为abc123_JBG。错了
我不确定这是否是预期的行为。

请帮忙。

谢谢!


阅读 315

收藏
2020-06-20

共1个答案

一尘不染

当前,Spring Data
REST仅支持由单个字段表示的复合键。这实际上意味着仅@EmbeddedId受支持。我已提交DATAJPA-770进行修复。

如果您可以切换到@EmbeddedId该语言,则仍然需要向Spring Data
REST讲授您要在URI中表示复杂标识符的方式,以及如何将路径段转换回id类型的实例。为此,实现一个BackendIdConverter并将其注册为Spring
bean。

@Component
class CustomBackendIdConverter implements BackendIdConverter {

  @Override
  public Serializable fromRequestId(String id, Class<?> entityType) {

    // Make sure you validate the input

    String[] parts = id.split("_");
    return new YourEmbeddedIdType(parts[0], parts[1]);
  }

  @Override
  public String toRequestId(Serializable source, Class<?> entityType) {

    YourIdType id = (YourIdType) source;
    return String.format("%s_%s", …);
  }

  @Override
  public boolean supports(Class<?> type) {
    return YourDomainType.class.equals(type);
  }
}
2020-06-20