Hibernate 和 Jackson 惰性序列化

Hibernate and Jackson lazy serialization

我正在开发一个使用 Hibernate 和 Jackson 序列化我的对象的项目。 我想我明白它应该如何工作,但我无法让它工作。

如果我理解得很好,一旦关系获取模式设置为 LAZY,如果你想要这个关系,你必须初始化它。

这是我的 class :

@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
@Table(schema="MDDI_ADMIN", name = "MINIUSINE")
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class MiniUsine {

    @Id
    @Column(name="MINIUSINEID", nullable = false)
    private int miniUsineID;

    @Column(name = "NAME", length = 40, nullable = false)
    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name="FluxID")
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private Set<Flux> fluxs = new HashSet<Flux>();

以及所有的 getter 和 setter。

我也试过这个 JsonInclude.Include.NON_EMPTY 作为 class 注释。也尝试了NON_NULL。 然而,杰克逊一直给我发

com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: MiniUsine.fluxs, no session or session was closed (through reference chain: java.util.ArrayList[0]->MiniUsine["fluxs"])

我正在将其序列化为:mapper.writeValueAsString(optMU);

使用 Jackson 2.3.2

感谢帮助

据我了解,hibernate returns 的实体对象是从您的实体 class 派生的代理。如果您尝试在事务外访问惰性字段的 getter 方法,您将获得 LazyInitializationException。 我想说的是,将通量设置为空集对您一点帮助都没有。

private Set<Flux> fluxs = new HashSet<Flux>();

Hibernate 重载 getter,如果您尝试在事务之外访问它(jackson 正在检查它是否为空),您会收到 LazyInit 错误。

我知道这是一个老问题,但我遇到了同样的问题。

您必须添加一个新的 Maven 依赖项以支持 JSON Hibernate 的序列化和反序列化。我使用的是 Hibernate5,所以我添加了

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.9.2</version>
</dependency>

现在注册新模块。

@Provider
public class JacksonHibernateProvider implements ContextResolver<ObjectMapper> {

    @Override
    public ObjectMapper getContext(final Class<?> type) {
        final ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Hibernate5Module());
        return mapper;
    }
}