我很難搞清楚如何在Web應用程序中正確定義和註釋模型,以便它們可以有效地用於Web界面和REST Web服務。這是給我找麻煩的關係的簡化版本:序列化與Spring MVC,Jackson和Hibernate的多對多關係的對象
Post模型:
@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...
}
我有獲取一個網絡服務控制器的方法所有帖子和一個獲取所有標籤的方法。理想情況下,每種方法都應該返回目標類和被引用類的列表。例如:
[{
postId: 1,
postBody: "Hello world!",
tags: [{
tagId: 1,
tagName: "hello"
},{
tagId: 2,
tagName: "message"
}]
}, {
postId: 2,
....
}]
但我風看到的內容是無限遞歸,作爲返回的標籤爲每個職位檢索其相關聯的支柱,其檢索及其關聯的標記等,以無窮大。我曾嘗試在我的類的getter方法上使用@JsonIgnore
,但後來我不再獲取引用的對象。我曾嘗試使用@JsonIdentityInfo
將ID添加到我的對象,但是我仍然得到遞歸,但僅限於檢索到的對象之間的所有引用都耗盡的點。我似乎無法找到解釋如何處理這些情況的任何文檔,這看起來很常見。
雖然這個例子中'@ JsonManagedReference'和'@ JsonBackReference'如何工作?根據上下文,「Post」和「Tag」都可以是父母或孩子。 – woemler
嗯,我想我錯過了這部分的問題。您仍然可以爲這些對象創建自己的序列化程序,然後跟蹤已經序列化的內容。 –