2012-10-16 57 views
7

有沒有辦法保持LAZY加載和反序列化使用id而不是POJO對象的對象。反序列化休眠和傑克遜延遲加載

我有2個類加入了多對多的關係。

像這樣的事情

public class User { 
    @Id 
    @JsonProperty 
    public long id; 

    @ManyToMany(
      fetch = FetchType.EAGER, 
    ) 
    @JoinTable(
      name = "User_EntityType", 
      joinColumns = @JoinColumn(name = "user_id"), 
      inverseJoinColumns = @JoinColumn(name = "type_id") 
    ) 
    @JsonProperty 
    public Set<Type> types; 

} 

public class Type { 
    @Id 
    @JsonProperty 
    public long id; 

    @ManyToMany(
      fetch = FetchType.EAGER, 
      mappedBy = "types", 
      targetEntity = User.class 
    ) 
    @JsonProperty 
    public Set<User> users; 
} 

數據類型的工作就好了。我可以在沒有問題的情況下使用hibernate進行編寫和讀取。

但是,我希望能夠使用REST API返回一個User對象,所以我使用Jackson來反序列化它。問題是,當我這樣做時,它會反序列化包含其他Type對象的User對象中的每個Type,並且會產生巨大的混亂。

是否有可能取而代之的是返回長類型ids而不是類型集?

回答

4

是的,如果您使用的是Jackson 2.0,可以使用Object Identity功能。

如果您使用@JsonIdentityInfo註釋標註類,那麼Jackson將只輸出一次該對象;隨後的引用將使用該ID代替。因此,只要類型輸出一次,您的類型集就會被序列化爲ID。當反序列化傑克遜將把ID變成對象。

在你的情況,我認爲你需要來註釋類型類是這樣的:

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") 
public class Type { 
    ... 
} 

有關如何使用此功能的詳細信息,請參閱http://wiki.fasterxml.com/JacksonFeatureObjectIdentity

0

我在我的JAX-RS端點中也遇到了這個問題,這些端點必須使用Jackson的對象映射器序列化和服務Hibernate實體。使用諸如@JsonIgnore@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class,...這樣的解決方案的選項對我來說不是一種選擇,因爲前者意味着關係字段從序列化輸出中被省略,後面的方法排序無法解決問題。

所以,我的解決辦法是在映射器下面的標誌設置進行實際系列化之前:

ObjectMapper objMapper = new ObjectMapper(); 
objMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 

這樣,有沒有試圖填充關係的對象,而不是他們的ID原封未動,所以我可以在我的關係字段上保留fetch = FetchType.LAZY標誌。