私は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は、どのように作成する必要がありますか?より一般的な質問として:春のデータ休憩で多対多の関連を扱うための正しいアプローチは何ですか?
なぜprivateプライベートPersonToTeamId id =新しいPersonToTeamId(); =新しいPersonToTeamId()を削除しますか?それはうまくいくでしょう。 – chetank
これは事を変更しません。問題は、ポストが要求されたときにConverterが空のシリアル化可能なIDで呼び出されることです。 – Gregor
万が一解決策を見つけましたか?私は同じ問題にぶつかります。 – Martin