【问题标题】:CrudRepository, cant save entity with a composite primary key using IdClassCrudRepository,无法使用 IdClass 保存具有复合主键的实体
【发布时间】:2020-01-13 12:58:32
【问题描述】:

我有以下实体:

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

我试图保存一个 projectEmployee:

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&lt;ProjectEmployee, ProjectEmployeeId&gt;。第二个参数应该代表 id。但是ProjetEmployee 没有一个主键,而是有两个主键,所以我想我应该将 id 类添加到不起作用的 id 参数中。如何使用带有 CrudRepository 的 IdClass 键保存具有复合主的实体?

【问题讨论】:

    标签: java spring jpa


    【解决方案1】:

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

    您的复合主要应包括来自 Employee 和 Project 的 ID,而不是整个实体。在这种情况下,请考虑使用@Embeddable 和@EmbeddedId 注释而不是@IdClass。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-03-16
        • 2017-05-25
        • 2021-07-30
        • 2023-03-22
        • 2017-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多