我有一个名为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。错了 我不确定这是否是预期的行为。
请帮忙。
谢谢!
当前,Spring Data REST仅支持由单个字段表示的复合键。这实际上意味着仅@EmbeddedId受支持。我已提交DATAJPA-770进行修复。
@EmbeddedId
如果您可以切换到@EmbeddedId该语言,则仍然需要向Spring Data REST讲授您要在URI中表示复杂标识符的方式,以及如何将路径段转换回id类型的实例。为此,实现一个BackendIdConverter并将其注册为Spring bean。
BackendIdConverter
@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); } }