json - 使用 Spring MVC、Jackson 和 Hibernate 序列化具有多对多关系的对象

标签 json hibernate rest spring-mvc jackson

我很难弄清楚如何在我的 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/

相关文章:

json - 将 "="分隔值文件转换为 ":"json 文件

javascript - extjs 数据存储发送到服务器(数据存储 -> json)

javascript - CoffeeScript $.post 从返回对象获取字符串

java - Hibernate Query.executeUpdate 是做什么的?

hibernate - 检索 Hibernate 查询结果作为结果集而不是列表

java - 用于定期付款的 Paypal JAVA REST API 示例

php - 使用 Flickr API 获取 Flickr 相册中所有照片的 URL

java - 服务器返回 HTTP 响应代码 : 400 for URL:

hibernate - CGLIB 增强失败 :argument type mismatch

spring - Feign Client + Eureka POST 请求体