2

我正在尝试使用 Hibernate、roo 和 JSON 获得 OneToMany 关系。

通过添加,我能够通过 jspx 页面查看父级的子级

 <field:display field="children" id="s_com_example_domain_Parent_children" object="${parent}" z="Etv5+hIcaVaq9A6jzjMOK0xoJMI="/>

到 /src/main/webapp/WEB-INF/parents/show.jspx

但是,当我执行 GET (type=application/json) 时看不到它们这是我的代码:

父.java:

 @RooJavaBean
 @RooToString
 @RooJpaActiveRecord
 @RooJson
 public class Parent {

private String name;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent")
private Set<Child> children = new HashSet<Child>();
 }

子.java

 @RooJavaBean
 @RooToString
 @RooJpaActiveRecord
 @RooJson
 public class Child {

private String name;

@ManyToOne
private Parent parent;
 }

罗贝壳:

jpa setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY
entity jpa --class ~.domain.Parent 
entity jpa --class ~.domain.Child
field set --fieldName children --type ~.domain.Child --class ~.domain.Parent --mappedBy     parent --cardinality ONE_TO_MANY --notNull false 
field reference --fieldName parent --type ~.domain.Parent --cardinality MANY_TO_ONE --class ~.domain.Child --notNull false
web mvc setup
web mvc all --package ~.web
web mvc json all 

我还添加了

     <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.12</version>
    </dependency>

到我的 Maven 项目。

如果我通过 web (jspx) 界面,我可以添加一个父 p 和子 c。我可以看到孩子有一个父母 p,父母有孩子 c,但这是我对 JSON 的 GET 请求的输出

 Request Url: http://localhost:8080/HibernateTest/children/1
 Request Method: GET
 {
     "id": 1,
     "name": "c",
     "parent": {
         "id": 1,
         "name": "p",
         "version": 0
     },
     "version": 0
 }

 Request Url: http://localhost:8080/HibernateTest/parents/1
 Request Method: GET
 {
     "id": 1,
     "name": "p",
     "version": 0
 }

如何让我的孩子在 JSON GET 请求中显示在父级下方?

4

2 回答 2

2

为了返回级联关系,你覆盖你的实体的 toJson() 方法(从你的 .aj 中推入),在你的父母中做这样的事情:

public String toJson() {
  return new JSONSerializer().include("*.children").serialize(this);
}

更多信息可以在这里找到。我认为您还可以使用一个注释,例如@Json 或类似的东西,您可以在其中指示在序列化中包含/排除哪些成员,但我不记得它,也无法通过谷歌找到它。

于 2013-04-24T19:34:07.030 回答
0

在 RooJson 注释上使用 deepSerialize 可以更深入地了解 Flexjson,而不必弄乱方面:

@RooJavaBean
@RooJpaActiveRecord
@RooJson(deepSerialize = true)
public class Office {

    @NotNull
    private String name;

    @OneToMany(targetEntity = Person.class, cascade = CascadeType.ALL, mappedBy = "office")
    private Set<Person> people = new HashSet<Person>();

    @NotNull
    @ManyToOne(targetEntity = Company.class)
    private Company company;
}
于 2013-09-12T05:03:55.780 回答