繁体   English   中英

Hibernate和Jackson懒惰的序列化

[英]Hibernate and Jackson lazy serialization

我正在研究一个使用Hibernate和Jackson来序列化我的对象的项目。 我想我理解它是如何被工作的,但我无法使其成功。

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

这是我的班级:

@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>();

所有的吸气者和安装者。

我也尝试过这个JsonInclude.Include.NON_EMPTY作为类注释。 还尝试了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返回的实体对象是一个派生自您的实体类的代理。 如果您尝试访问事务之外的惰性字段的getter方法,则会出现LazyInitializationException。 我想说的是将通量设置为空集对你没有任何帮助。

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

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

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

您必须添加新的maven依赖以支持Hibernate的JSON序列化和反序列化。 我使用了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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM