我很难弄清楚如何在我的 Web 应用程序中正确定义和注释模型,以便它们可以在 Web 界面和 REST Web 服务中有效使用。这是给我带来麻烦的关系的简化版本:
岗位型号:
@Entity
@Table(name = "POST")
public class Post implements Serializable {
@Id
@Column(name = "POST_ID")
@GeneratedValue(strategy-GenerationType.AUTO)
private Integer postId;
@Column(name = "POST_BODY")
private String postBody;
@ManyToMany(fetch = FetchType.EAGER)
@Cascade({CascadeType.SAVE_UPDATE})
@JoinTable(name = "POST_TAGS",
joinColumns={@JoinColumn(name="POST_ID")},
inverseJoinColumns={@JoinColumn(name="TAG_ID")})
private Set<Tag> tags = new HashSet<Tag>();
//Getters and setters...
}
标签型号
@Entity
@Table(name = "TAG")
public class Tag implements Serializable {
@Id
@Column(name = "TAG_ID")
@GeneratedValue(strategy-GenerationType.AUTO)
private Integer tagId;
@Column(name = "TAG_NAME")
private String tagName;
@ManyToMany(fetch = FetchType.EAGER, mappedBy="tags")
private Set<Post> posts = new HashSet<Post>();
//Getters and setters...
}
我有一种用于获取所有帖子的 Web 服务 Controller 方法和一种用于获取所有标签的方法。理想情况下,每个方法都应该返回目标类和引用类的列表。例如:
[{
postId: 1,
postBody: "Hello world!",
tags: [{
tagId: 1,
tagName: "hello"
},{
tagId: 2,
tagName: "message"
}]
}, {
postId: 2,
....
}]
但是我最终看到的是无限递归,因为每个帖子的返回标签检索其关联的帖子,这些帖子检索其关联的标签等到无穷大。我试过使用
@JsonIgnore
在我的类的 getter 方法上,但是我不再获得引用的对象。我试过使用 @JsonIdentityInfo
将 ID 添加到我的对象中,但随后我仍然会递归,但只是到了检索到的对象之间的所有引用都用尽的程度。我似乎找不到任何解释如何处理此类情况的文档,这似乎很常见。
最佳答案
您可以为此使用 Jackson 的注释( @JsonManagedReference
和 @JsonBackReference
)。
查询 http://wiki.fasterxml.com/JacksonFeatureBiDirReferences
或者您可以编写自己的序列化程序并跟踪您已经序列化的内容,这是我在不得不使用 Gson 而不是 Jackson 时最终做的事情。
关于json - 使用 Spring MVC、Jackson 和 Hibernate 序列化具有多对多关系的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23155737/