在hibernate和jackson中反序列化延迟加载

use*_*206 7 java hibernate jackson

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

我有两个由多对多关系加入的课程.

像这样的东西

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;
}
Run Code Online (Sandbox Code Playgroud)

数据类型工作得很好.我可以使用hibernate进行编写和读取,没有任何问题.

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

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

gut*_*tch 4

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

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

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

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Type {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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