2016-04-13 14 views
4

私はJPAエンティティとエンティティチームを持っています。どちらもエンティティPersonToTeamによって結合されています。この結合エンティティは、Personと1対チームの多対1の関係を保持します。これには、PersonのIDとTeamのIDで構成される複数列のキーがあります。これは@EmbeddedIdで表されます。埋め込みIDを要求IDに前後に変換するには、私はコンバータを持っています。このすべてがSpring Data REST @Idclass not recognized春のデータ休み投稿リクエストから@EmbeddedIdを構築できません

の提案を次のコードは次のようになります。

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

このコンバーターとの問題は、POSTリクエストを作成しようとするとfromRequestId方法は、idパラメータとしてnullを取得していること、ですnew personToTeamアソシエーション。しかし、ポストのペイロードに関する他の情報はありません。それで、人とチームに対する外部キーを持つIDは、どのように作成する必要がありますか?より一般的な質問として:春のデータ休憩で多対多の関連を扱うための正しいアプローチは何ですか?

+0

なぜprivateプライベートPersonToTeamId id =新しいPersonToTeamId(); =新しいPersonToTeamId()を削除しますか?それはうまくいくでしょう。 – chetank

+0

これは事を変更しません。問題は、ポストが要求されたときにConverterが空のシリアル化可能なIDで呼び出されることです。 – Gregor

+0

万が一解決策を見つけましたか?私は同じ問題にぶつかります。 – Martin

答えて

2

同じ問題が発生した後、解決策が見つかりました。 idnullの場合はの代わりにnew PersonToTeamId()fromRequestId()に返す以外は、コードは問題ありません。

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

そして@EmbeddedIdの一部は、単純なデータ型ではなく、外国ではありません場合は:あなたがidオブジェクトにpersonIdteamIdをラップする必要があなたのPOSTリクエストでJSONを使用していると仮定すると、

キー:

{ 
    "id": { 
    "stringId": "foo", 
    "foreignKeyId": "http://localhost:8080/path/to/other/resource/1" 
    }, 
    ... 
} 
+0

マーティン、あなたは私の日を救う! "id":{}の詳細は非常に重要です! @Gregor、この答えを正しいとマークしてください。 –

+0

この投稿のURIは何ですか? – Taimur

+0

@ Taimur:正確に何を知りたいですか?エンティティは、任意のURIで公開することができます。 – Martin

関連する問題