2

私には調査と情報の2つのエンティティがあります。

調査エンティティ:

@RooJavaBean
@RooToString
@RooJpaActiveRecord(table = "information")
@JsonPropertyOrder({ "seq"})
public class Information {

    @NotNull
    private String title;

    @ManyToOne(fetch = FetchType.LAZY)
    @JsonBackReference
    private Survey survey;

    private int seq;
}

情報エンティティ:

@RooJavaBean
@RooToString
@RooJpaActiveRecord(table = "survey")
public class Survey {
    @NotNull
    @Size(min = 3, max = 50)
    private String title;  

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="survey")
    @JsonManagedReference
    private Set<Information> informations = new HashSet<Information>();

}

私はジャクソンを使ってシリアル化しました。

私が期待すること:

{
  "survey" : {
    "title" : "Medical Survey",
    "informations" : [ {
      "id" : 1,
      "seq" : 0,
      "title" : "Name:",
      "version" : 0
    }, {
      "id" : 2,
      "seq" : 1,
      "title" : "Age:",
      "version" : 0
    },  {
      "id" : 3,
      "seq" : 2,
      "title" : "test",
      "version" : 0
    }, {
      "id" : 4,
      "seq" : 3,
      "title" : "test",
      "version" : 0
    } ],
    "id" : 1,
    "version" : 134
  }
}

しかし、それが出てくるもの:

{
  "survey" : {
    "title" : "Medical Survey",
    "informations" : [ {
      "id" : 2,
      "seq" : 1,
      "title" : "Age:",
      "version" : 0
    }, {
      "id" : 4,
      "seq" : 3,
      "title" : "test",
      "version" : 0
    }, {
      "id" : 3,
      "seq" : 2,
      "title" : "test",
      "version" : 0
    }, {
      "id" : 1,
      "seq" : 0,
      "title" : "Name:",
      "version" : 0
    } ],
    "id" : 1,
    "version" : 134
  }
}
  1. この場合、listを使用する方が適しているはずですが、SpringRooはscaffoldでlistをサポートできません。したがって、seq番号を含むHashSetを使用しました。
  2. また、@transientになる情報の配列リストを作成し、それをビジネスレイヤーで複製して並べ替えることができることも知っています。

しかし、よりクリーンな解決策、つまりシリアル化時の注文があるかどうかを知りたいです。ありがとう。

4

1 に答える 1

3

HashSetを注文することはできません。これは、通常のJavaの動作です。代わりに探しているのはTreeSetです。コンパレータを提供するか、情報クラスにComparableを実装すると、Jsonが注文されます。

于 2013-03-27T14:19:54.033 に答える