java - CrudRepository,无法使用 IdClass 保存具有复合主键的实体

标签 java spring jpa

我有以下实体:

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

  @Id
  @ManyToOne
  private Project project;

  @Id
  @ManyToOne
  private Employee employee;

  @ManyToOne
  private ProjectEmployeeRole projectEmployeeRole;
}

定义上述实体的复合主键的 id 类:

@Data
public class ProjectEmployeeId implements Serializable {
  private Project project;

  private Employee employee;
}

这就是存储库:

public interface ProjectEmployeeRepository
        extends CrudRepository<ProjectEmployee, ProjectEmployeeId> {
}

我尝试保存项目员工:

projectEmployeeRepository.save(projectEmployee);

这给了我以下错误:

Resolved [org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.Long' to required type 'de.employee.Employee' for property 'employee'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.Long' to required type 'de.employee.Employee' for property 'employee': no matching editors or conversion strategy found]

我是第一次使用复合主键,所以我不确定它应该如何工作。问题可能来自定义 CrudRepository<ProjectEmployee, ProjectEmployeeId> 。第二个参数应该代表 id。但是ProjetEmployee没有一个主键,而是有两个,所以我想我应该将 id 类添加到 id 参数中,但这不起作用。如何使用 IdClass 键和 CrudRepository 保存具有复合主实体的实体?

最佳答案

您的存储库期望 ProjectEmployeeId 具有长整型数据类型的 ID。您的代码 ProjectEmployeeId 中包含私有(private) Employee 员工对象,而不是长原始 id。

您的复合主要 ID 应包含员工和项目的 ID,而不是整个实体。在这种情况下,请考虑使用 @Embeddable 和 @EmbeddedId 注释而不是 @IdClass。

关于java - CrudRepository,无法使用 IdClass 保存具有复合主键的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59717136/

相关文章:

java - ExecutorService 永远不会停止,没有异常

Java:为什么两个类中的两个文字(相同的内容)使用相同的内部字符串?

spring - 禁用 Spring @Autowired Provider<T> 行为

java - Eclipse JPA Facet 报告无效查询

java - 如何在父自定义对象数组列表中获取自定义对象子列表中的单个项目位置?

java - 轴客户端 stub 超时问题

java - @MapperScan 和 @Bean MapperScannerConfigurer 之间的区别

spring & web service 客户端 - 故障详情

java - MySQL 上的@GeneratedValue 多态抽象父类(super class)

jpa - 从层次结构中检索的实体的类