복붙노트

[SPRING] Spring 데이터 나머지 @EmbeddedId는 Post 요청에서 생성 할 수 없습니다.

SPRING

Spring 데이터 나머지 @EmbeddedId는 Post 요청에서 생성 할 수 없습니다.

JPA 엔티티 Person과 엔티티 팀이 있습니다. 둘 다 엔티티 PersonToTeam에 의해 결합됩니다. 이 참여 엔티티는 Person과 Team간에 1 대 1의 관계를 유지합니다. 그것은 Person과 @ImbeddedId로 대표되는 Team의 id로 구성된 multi-column 키를 가지고 있습니다. 임베디드 ID를 요청 ID로 앞뒤로 변환하려면 변환기가 있어야합니다. 이 모든 것은 스프링 데이터 REST @Idclass가 인식되지 않는 것에 대한 제안을 따른다.

코드는 다음과 같습니다.

@Entity
public class PersonToTeam {
    @EmbeddedId
    @Getter
    @Setter
    private PersonToTeamId id = new PersonToTeamId();

    @ManyToOne
    @Getter
    @Setter
    @JoinColumn(name = "person_id", insertable=false, updatable=false)
    private Person person;

    @ManyToOne
    @Getter
    @Setter
    @JoinColumn(name = "team_id", insertable=false, updatable=false)
    private Team team;

    @Getter
    @Setter
    @Enumerated(EnumType.STRING)
    private RoleInTeam role;

    public enum RoleInTeam {
        ADMIN, MEMBER
    }
}

    @EqualsAndHashCode
    @Embeddable
    public class PersonToTeamId implements Serializable {
        private static final long serialVersionUID = -8450195271351341722L;
        @Getter
        @Setter
        @Column(name = "person_id")
        private String personId;

        @Getter
        @Setter
        @Column(name = "team_id")
        private String teamId;
    }

@Component
public class PersonToTeamIdConverter implements BackendIdConverter {

    @Override
    public boolean supports(Class<?> delimiter) {
        return delimiter.equals(PersonToTeam.class);
    }

    @Override
    public Serializable fromRequestId(String id, Class<?> entityType) {
        if (id != null) {
            PersonToTeamId ptid = new PersonToTeamId();
            String[] idParts = id.split("-");
            ptid.setPersonId(idParts[0]);
            ptid.setTeamId(idParts[1]);
            return ptid;
        }
        return BackendIdConverter.DefaultIdConverter.INSTANCE.fromRequestId(id, entityType);
    }

    @Override
    public String toRequestId(Serializable id, Class<?> entityType) {
        if (id instanceof PersonToTeamId) {
            PersonToTeamId ptid = (PersonToTeamId) id;
            return String.format("%s-%s", ptid.getPersonId(), ptid.getTeamId());
        }
        return BackendIdConverter.DefaultIdConverter.INSTANCE.toRequestId(id, entityType);
    }
}

이 변환기의 문제점은 게시물 요청이 새 personToTeam 연결을 만들려고 할 때 fromRequestId 메서드가 id 매개 변수로 null을 가져옵니다. 그러나 게시물의 탑재량에 대한 다른 정보는 없습니다. 그럼 어떻게 그 사람과 팀에 외래 키를 가진 이드를 만들어야합니까? 더 일반적인 질문 : 봄 데이터 휴식에서 다 - 대 - 다 모임을 처리하기위한 올바른 접근 방법은 무엇입니까?

해결법

  1. ==============================

    1.같은 문제에 직면 한 후 해결책을 찾았습니다. fromRequestId ()에서 id가 null 인 경우 DefaultIdConverter 대신 새 PersonToTeamId ()를 반환한다는 것을 제외하고는 코드가 잘되어야합니다.

    같은 문제에 직면 한 후 해결책을 찾았습니다. fromRequestId ()에서 id가 null 인 경우 DefaultIdConverter 대신 새 PersonToTeamId ()를 반환한다는 것을 제외하고는 코드가 잘되어야합니다.

    게시물 요청에 JSON을 사용한다고 가정하면 personId 및 teamId를 ID 객체로 래핑해야합니다.

    {
      "id": {
        "personId": "foo",
        "teamId": "bar"
      },
      ...
    }
    

    그리고 @EmbeddedId의 일부가 간단한 데이터 형식이 아니라 외래 키인 경우 :

    {
      "id": {
        "stringId": "foo",
        "foreignKeyId": "http://localhost:8080/path/to/other/resource/1"
      },
      ...
    }
    
  2. from https://stackoverflow.com/questions/36606251/spring-data-rest-embeddedid-cannot-be-constructed-from-post-request by cc-by-sa and MIT license