복붙노트

[SPRING] 봄 데이터 나머지를 통해 합성 테이블에 데이터를 저장할 수 없습니다 json post

SPRING

봄 데이터 나머지를 통해 합성 테이블에 데이터를 저장할 수 없습니다 json post

나는 3 개의 테이블을 가지고있다. 훈련    - training_id (pk) 유저 프로필     - profile_id (pk) -training_profile (합성 테이블)     - training_id     - profile_id

profile_id = 44 인 user_profile 테이블에 이미 레코드를 저장하고 있으며 training 테이블에 대한 새 레코드를 만들고이 새 교육을 id 44가있는 기존 user_profile 레코드와 연결하려고합니다. 그러나 포스트 데이터가 training 테이블에 저장되었지만 검색 테이블 user_training에 삽입되지 않았습니다. 내 객체 클래스는  - 연수반

@Entity
@Table(name = "training", schema = "public")
public class Training implements java.io.Serializable {

    @Id @GeneratedValue
    @Column(name = "training_id", unique = true, nullable = false)
    private Long trainingId;


    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "trainings")
    private Set<UserProfile> userProfiles = new HashSet<UserProfile>(0);

    @Column(name = "training_subject", length = 200)
    private String trainingSubject;

    public Training() {
    }

    public Long getTrainingId() {
        return this.trainingId;
    }

    public void setTrainingId(Long trainingId) {
        this.trainingId = trainingId;
    }


    public String getTrainingSubject() {
        return this.trainingSubject;
    }

    public void setTrainingSubject(String trainingSubject) {
        this.trainingSubject = trainingSubject;
    }


    public Set<UserProfile> getUserProfiles() {
        return this.userProfiles;
    }

    public void setUserProfiles(Set<UserProfile> userProfiles) {
        this.userProfiles = userProfiles;
    }
}

우편 저를 통해 내 json 게시물

그리고 내가 얻은 반응

응답에 training_id가 67 인 테이블에 새로운 교육 레코드가 삽입 된 것으로 나타났습니다. 이 새로운 저장된 훈련에 대한 연관성 없음

다시 교육을위한 새로운 기록을 만들었고 기존 사용자 프로필과 연결되지 않았습니다. curl -i -X ​​POST -H "Content-Type : application / json"-d "{\"trainingSubject \ ": \"Oracle \ " , \ "userProfiles \": [\ "/ userProfiles / 44 \"]} "http : // localhost : 8080 / api / trainings

해결법

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

    1.상대 URL 할당을 사용할 수 있습니다.

    상대 URL 할당을 사용할 수 있습니다.

    {
        "trainingSubject": "oracle",
        "userProfiles":["/userProfiles/44"]
    }
    

    http : // localhost : 8080 / api / userProfiles / 44 또한 전체 URL을 사용해보십시오.

    편집 됨

    ManyToMany 관계의 소유 사이트를 Training으로 이동하면 위 JSON과 작동합니다. 그래서 현재 소유자는 부동산을 설정할 수 있습니다. 당신이 그렇게한다면 :

    @ManyToMany
    @JoinTable(name = "user_training"
    , joinColumns = {@JoinColumn(name = "profile_id") }
    , inverseJoinColumns = {@JoinColumn(name = "training_id") })
    private List<UserProfile> userProfiles = new ArrayList<>();
    

    @ManyToMany(mappedBy = "userProfiles")
    private List<Training> trainings = new ArrayList<>();
    

    Training은 userProfiles 내에서 관계를 소유합니다.

    나는 당신의 경우에 그것이 지금 최고의 선택이라고 생각합니다. 또 다른 옵션은 트랜잭션에서 UserProfile의 소유자 사이트를 유지할 때 다음과 같은 관계를 업데이트하는 것입니다.

    PATCH http://localhost:8080/api/userProfiles/44
    {
        "trainings": ["trainings/66", "trainings/67"]
    }
    

    그러나 이것으로 당신은 여러 번의 휴식을 취할 필요가 있습니다 (1. POST 새로운 훈련과 새로운 ID를 얻으십시오 2. 현재 훈련 목록을 얻으십시오 3. 새로 추가 된 훈련을 가진 PATCH 훈련 목록)

    마지막 옵션은 REST- 컨트롤러를 직접 추가하는 것입니다.

    첫 번째 접근법을위한 완벽한 파일 :

    @Entity
    @Table
    public class Training implements Serializable {
    
        @Id
        @GeneratedValue
        private Long trainingId;
    
        @ManyToMany
        @JoinTable(name = "user_training"
        , joinColumns = {@JoinColumn(name = "profile_id") }
        , inverseJoinColumns = {@JoinColumn(name = "training_id") })
        private List<UserProfile> userProfiles = new ArrayList<>();
    
        @Column(name = "training_subject", length = 200)
        private String trainingSubject;
    
    
    @Entity
    @Table
    public class UserProfile implements Serializable {
    
        @Id
        @GeneratedValue
        private Long profileId;
    
        @Column(name = "profile_description")
        private String profileDescription;
    
        @ManyToMany(mappedBy = "userProfiles")
        private List<Training> trainings = new ArrayList<>();
    
    
    public interface TrainingRepository extends JpaRepository<Training, Long> {
    }
    
    public interface UserProfileRepository extends JpaRepository<UserProfile, Long> {
    }
    

    위의 JSON을 사용하면 테스트 할 수 있습니다. 컬 -POST의 응답에서 올바른 결과를 직접 볼 수 없습니다. 추가 된 관계를 보려면 GET http : // localhost : 8080 / transactions / / userProfiles와 같은 userProfiles-link를 따라야합니다.

  2. from https://stackoverflow.com/questions/43111692/unable-to-save-data-to-composite-table-via-spring-data-rest-json-post by cc-by-sa and MIT license