【问题标题】:deserialize lazy loading in hibernate and jackson在休眠和杰克逊中反序列化延迟加载
【发布时间】:2012-10-16 21:35:24
【问题描述】:

有没有办法使用 id 而不是 POJO 对象来保持 LAZY 加载和反序列化对象。

我有 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;
}

数据类型工作得很好。我可以毫无问题地使用休眠进行读写。

但是,我希望能够使用 REST API 返回一个 User 对象,因此我使用 Jackson 来反序列化它。问题是当我这样做时,它会反序列化 User 对象中的每个 Type,其中包括其他 Type 对象,这会造成巨大的混乱。

是否可以只返回 Set of Long 类型 ID 而不是 Set of Type?

【问题讨论】:

    标签: java hibernate jackson


    【解决方案1】:

    是的,如果您使用的是带有对象标识功能的 Jackson 2.0,这是可能的。

    如果你用@JsonIdentityInfo注解一个类,那么Jackson只会输出一次对象;后续引用将使用 ID。因此,只要类型已输出一次,您的类型集就会被序列化为 ID。当反序列化 Jackson 时,会将 ID 转回对象。

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-10
        • 2013-05-25
        • 2015-02-07
        • 1970-01-01
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多