Spring Data REST @Idclass无法识别

rak*_*pan 8 spring hibernate jpa spring-data spring-data-rest

我有一个名为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
}
Run Code Online (Sandbox Code Playgroud)

我有一个Spring Data Repository,如下所示

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

}
Run Code Online (Sandbox Code Playgroud)

此外,我有一个注册转换器从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.这是错的.我不确定这是否是预期的行为.

请帮忙.

谢谢!

Oli*_*ohm 14

目前,Spring Data REST仅支持由单个字段表示的复合键.这实际上意味着只@EmbeddedId支持.我已经提交了DATAJPA-770来解决这个问题.

如果您可以切换到@EmbeddedId您仍然需要以您希望在URI中表示复杂标识符的方式教授Spring Data REST,以及如何将路径段转换回您的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);
  }
}
Run Code Online (Sandbox Code Playgroud)


dto*_*ola 6

如果您不能使用@EmbeddedId,您仍然可以使用@IdClass。为此,您需要像 Oliver Gierke 回答的 BackendIdConverter,但您还需要为您的域类型添加一个 Lookup:

@Configuration
public class IdClassAllowingConfig extends RepositoryRestConfigurerAdapter {

@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
    config.withEntityLookup().forRepository(EmployeeDepartmentRepository.class, (EmployeeDepartment ed) -> {
        EmployeeDepartmentPK pk = new EmployeeDepartmentPK();
        pk.setDepartmentId(ed.getDepartmentId());
        pk.setEmployeeId(ed.getEmployeeId());
        return pk;
    }, EmployeeDepartmentRepository::findOne);
}
Run Code Online (Sandbox Code Playgroud)

}