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

wnrlj8wa  于 2023-06-21  发布在  Spring
关注(0)|答案(3)|浏览(171)

我有以下实体:

@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;
}

这就是repository:

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

我试图保存一个项目Employee:

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参数中,这是不起作用的。如何使用CrudRepository中的IdClass键保存具有复合主属性的实体?

o4tp2gmn

o4tp2gmn1#

您的存储库期望ProjectEmployeeId假定具有Long数据类型的id。你在代码中有什么ProjectEmployeeId,带有私有Employee雇员对象,而不是long原语id。
您的复合主数据库应包括来自员工和项目的ID,而不是整个实体。在这种情况下,请考虑使用@Embeddable和@EmbeddedId注解,而不是@IdClass。

camsedfj

camsedfj2#

类似的问题在这里被问到https://stackoverflow.com/a/28346375/12699765。尝试使用@EmbeddedId。

ajsxfq5m

ajsxfq5m3#

我遇到了这个完全相同的edge-case错误,正如Omar在他的回答中所描述的,我将“IdClass”实体中的引用实体更改为Long。
这解决了问题。
所以在问题的例子中:

  • Project project转换为Long projectId
  • Employee employee转换为Long employeeId

相关问题