我正在开发一个使用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
感谢您的帮助
答案 0 :(得分:3)
据我所知,hibernate返回的实体对象是一个派生自你的实体类的代理。如果您尝试访问事务之外的惰性字段的getter方法,则会出现LazyInitializationException。 我想说的是将通量设置为空集对你没有任何帮助。
private Set<Flux> fluxs = new HashSet<Flux>();
Hibernate重载getter,如果你试图在事务之外访问它(jackson正在检查它是否为空),你会得到LazyInit错误。
答案 1 :(得分:1)
我知道这是一个老问题,但我遇到了同样的问题。
您必须添加新的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;
}
}