反序列化休眠和杰克逊中的延迟加载

有没有办法保持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,并且会产生巨大的混乱。

是否有可能只是返回一组长类型ID而不是一组类型?


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

如果您使用@JsonIdentityInfo批注注释类,那么Jackson只会输出一次对象; 随后的引用将使用该ID代替。 因此,只要类型输出一次,您的类型集就会被序列化为ID。 当反序列化杰克逊将把ID变成对象。

在你的情况下,我认为你需要像这样注释你的Type类:

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

有关如何使用此功能的详细信息,请参阅http://wiki.fasterxml.com/JacksonFeatureObjectIdentity。


我在我的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标志。

链接地址: http://www.djcxy.com/p/64691.html

上一篇: deserialize lazy loading in hibernate and jackson

下一篇: Delphi Datasnap client code not getting unauthorized exception