web-dev-qa-db-ja.com

春のデータは複合主キーで残ります

CrudにはSpringDataRestを使用しています。しかし、エンティティに複合主キーがある場合、主キーを指定してエンティティを取得する方法がわかりません。

リバークラス:

@Entity
public class River {
    private RiverPK id;
    private Double length;
    private Timestamp date;
    private String comment;


    @Basic
    @Column(name = "length")
    public Double getLength() {
        return length;
    }

    public void setLength(Double length) {
        this.length = length;
    }

    @Basic
    @Column(name = "date")
    public Timestamp getDate() {
        return date;
    }

    public void setDate(Timestamp date) {
        this.date = date;
    }

    @Basic
    @Column(name = "comment")
    public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }

    @Id
    public RiverPK getId() {
        return id;
    }

    public void setId(RiverPK id) {
        this.id = id;
    }
}

RiverPKクラス:

@Embeddable
public class RiverPK implements Serializable {
    private String name;
    private int upcode;
    private int downcode;

    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column(name = "upcode")
    public int getUpcode() {
        return upcode;
    }

    public void setUpcode(int upcode) {
        this.upcode = upcode;
    }

    @Column(name = "downcode")
    public int getDowncode() {
        return downcode;
    }

    public void setDowncode(int downcode) {
        this.downcode = downcode;
    } 

}

RiverDAOクラス:

@RepositoryRestResource(path = "river")
public interface RiverDAO extends JpaRepository<River, RiverPK> {
}

次に、get http:// localhost:8080/river / を呼び出して河川データを取得し、post http:// localhost:8080/riverを呼び出してdbに新しいエンティティを作成することもできます。 / {river json}

リバーjsonは:

id": {

    "name": "1",
    "upcode": 2,
    "downcode": 3

},
"length": 4.4,
"date": 1493740800000,
"comment": "6"
}

Spring Data Rest docでは、get localhost:8080/river/1(主キー)を呼び出して、主キーが1であるエンティティを取得できる必要があります。これは、エンティティに主キーが1つしかない場合に機能します。しかし、私のエンティティであるRiverには、RiverPKとしての複合主キーがあります。 get localhost:8080/river/{name = '1'、upcode = 2、downcode = 3}を呼び出すと、「タイプ[Java.lang.String]からタイプ[comに変換できるコンバーターが見つかりません」というエラーが返されます。 .example.db.entity.RiverPK] "、つまり、文字列として{name = '1'、upcode = 2、downcode = 3}を使用しますが、RiverPKタイプは使用しません。

問題は、他の通常のエンティティとして複合主キーを使用してget\put\deleteを呼び出す方法ですか?

6
kidfruit

確認できるjiraの問題があります: https://jira.spring.io/browse/DATAREST-598

このコメントはあなたにとって特に興味深いかもしれません

https://jira.spring.io/browse/DATAREST-598?focusedCommentId=117740&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-11774

そこには、サンプルプロジェクトへの github link もあります。 BackendIdConverter を使用して、複合キーを文字列に変換して戻します。したがって、トリックは、複合IDをパスセグメントとして使用できる文字列に変換することです。

この答えはあなたにとっても興味深いかもしれません https://stackoverflow.com/a/31830586/5371736

6
Mathias Dpunkt