我有一个名为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 存储库,定义如下
@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。这是错误的。我不确定这是否是预期行为。
请帮帮忙。
谢谢你!
4条答案
按热度按时间8gsdolmq1#
目前Spring Data REST只支持由单个字段表示的复合键。这实际上意味着只支持
@EmbeddedId
。我已经提交了DATAJPA-770来解决这个问题。如果您可以切换到
@EmbeddedId
,您仍然需要教Spring Data REST您希望在URI中表示复杂标识符的方式,以及如何将路径段转换回id类型的示例。要实现这一点,请实现一个BackendIdConverter
并将其注册为Spring bean。pkwftd7m2#
如果你不能使用
@EmbeddedId
,你仍然可以使用@IdClass
。为此,你需要像奥利弗Gierke回答的那样使用BackendIdConverter,但是你还需要为你的域类型添加一个Lookup:}
yeotifhr3#
使用
@BasePathAwareController
自定义Spring Data 休息控制器。对于示例uri
/api/custInfoCustAccts/89232_70
,它可以正常工作t30tvxxf4#
更一般的方法如下: