CrudRepository, не может сохранить сущность с составным первичным ключом, используя IdClass - PullRequest
1 голос
/ 13 января 2020

У меня есть следующая сущность:

@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<ProjectEmployee, ProjectEmployeeId>. Второй аргумент должен представлять идентификатор. Но ProjetEmployee не имеет одного первичного ключа, вместо этого он имеет два, поэтому я подумал, что должен добавить класс id в аргумент id, который не работает. Как сохранить сущность с составным первичным объектом, используя ключ IdClass с CrudRepository?

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Ваш репозиторий ожидает, что ProjectEmployeeId предположительно будет иметь идентификатор с типом данных Long. Что у вас есть в коде ProjectEmployeeId с частным объектом сотрудника Employee, а не с длинным примитивным идентификатором.

Ваш составной первичный должен включать идентификатор Employee и Project, а не всю сущность. В этом случае рассмотрите возможность использования аннотаций @Embeddable и @EmbeddedId вместо @ IdClass.

0 голосов
/ 13 января 2020

Подобный вопрос был задан здесь { ссылка }. Попробуйте использовать @ EmbeddedId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...