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;
}
}
我正在开发一个使用 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;
}
}