反序列化休眠和杰克逊中的延迟加载
有没有办法保持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标志。 
上一篇: deserialize lazy loading in hibernate and jackson
下一篇: Delphi Datasnap client code not getting unauthorized exception
