问题
I'm working on a project using Hibernate and Jackson to serialize my objects. I think I understand how it is suposed to work but I can't manage to make it works.
If I understand well, as soon as a relation fetch mode is set to LAZY, if you want this relation, you have to initialize it.
Here is my 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>();
And all getters and setters.
I've also tried this JsonInclude.Include.NON_EMPTY
as class annotation. Also tried the NON_NULL.
However, jackson keeps sending me
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"])
I'm serializing it with : mapper.writeValueAsString(optMU);
Using Jackson 2.3.2
Thanks for help
回答1:
As far as I understand, the entity object that hibernate returns is a proxy which derives from your entity class. If you try to access getter methods for lazy fields outside of a transaction, you get LazyInitializationException. The point I want to make is setting fluxs to empty set doesn't help you at all.
private Set<Flux> fluxs = new HashSet<Flux>();
Hibernate overloads the getter and if you try to access it outside of a transaction(which jackson is doing to check if it is empty), you get the LazyInit error.
回答2:
I know this is an old question but I had the same problem.
You must add a new maven dependecy to support JSON serialization and deserialization of Hibernate. I used Hibernate5 so I added
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
<version>2.9.2</version>
</dependency>
Now register the new module.
@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;
}
}
来源:https://stackoverflow.com/questions/37678919/hibernate-and-jackson-lazy-serialization