Я работаю над проектом, использующим Hibernate и Jackson для сериализации моих объектов. Думаю, я понимаю, как это работает, но я не могу заставить его работать.Hibernate и Jackson lazy serialization
Если я хорошо понимаю, как только режим выборки отношений установлен в 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);
Использование Джексон 2.3.2
Спасибо за помощь
Но он не должен обращаться к нему, когда он пуст (когда я его не инициализирую) из-за '@JsonInclude (JsonInclude.Include.NON_EMPTY)' Я никогда не получаю доступ к нему сам, только Джексон хочет получить доступ это при сериализации объекта – xNeyte
@JsonInclude (JsonInclude.Include.NON_EMPTY) означает включение этого поля, только если оно не пустое. Но чтобы проверить, нужно ли его пустое, Джексону нужно вызвать .isEmpty() в коллекции? Однако эта коллекция не является пустой hash_set, которую вы предоставили. Он предоставляется спящим режимом. И этот вызов произойдет за пределами транзакции, что приведет к ошибке. – saby
Поскольку fetchmode LAZY, сбор не должен быть загружен, если я его не инициализирую, поэтому он должен быть пустым, когда джексон проверяет его :( – xNeyte