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 应该更合适,但 Spring Roo 不支持脚手架中的列表。因此,我使用了带有 seq 编号的 HashSet。
  2. 我也知道我可以创建一个信息数组列表作为@transient,然后在业务层对其进行克隆和排序。

但是我想知道有没有更干净的解决方案,即序列化时排序。谢谢。

4

1 回答 1

3

无法订购 HashSet,这只是正常的 java 行为。您正在寻找的是 TreeSet。为它提供一个 Comparator,或者在你的信息类中实现 Comparable,你的 Json 将被订购。

于 2013-03-27T14:19:54.033 回答