2017-12-20 6 views
0

ich mit Sammlungen ein Entity, und ich würde Last Entity in faul mag, aber ich habe Fehler:Fehler verzögertes Laden: com.fasterxml.jackson.databind.JsonMappingException: failed träge, um eine Sammlung von Rolle zu initialisieren

Caused by: com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: lu.entities.folders.Folders.requests, could not initialize proxy - no Session (through reference chain: lu.entities.folders.Folders.requests) 
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:210) 
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:177) 
    at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:190) 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:674) 
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:129) 
    at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:851) 
    at org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider.writeTo(ResteasyJackson2Provider.java:207) 
    at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.writeTo(AbstractWriterInterceptorContext.java:131) 
    at org.jboss.resteasy.core.interception.ServerWriterInterceptorContext.writeTo(ServerWriterInterceptorContext.java:60) 
    at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:120) 
    at org.jboss.resteasy.security.doseta.DigitalSigningInterceptor.aroundWriteTo(DigitalSigningInterceptor.java:145) 
    at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:124) 
    at org.jboss.resteasy.plugins.interceptors.encoding.GZIPEncodingInterceptor.aroundWriteTo(GZIPEncodingInterceptor.java:100) 
    at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:124) 
    at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:98) 
    at org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.java:466) 
    ... 38 more 
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: lu.pgd.ccpd.entities.folders.Folders.requests, could not initialize proxy - no Session 
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:587) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:204) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:148) 
    at org.hibernate.collection.internal.PersistentBag.size(PersistentBag.java:261) 
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:88) 
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24) 
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
    ... 51 more 

Und meine Entitäten wie:

@Entity 
@Table(name = "FOLDER_FR") 
@JsonIdentityInfo(scope=Folders.class, generator = ObjectIdGenerators.PropertyGenerator.class, property="id") 
public class Folders implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    @Column(name = "FR_ID") 
    private Long id; 

    @LazyCollection(LazyCollectionOption.TRUE) 
    @JsonIgnore 
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinTable(name = "M_REQUESTFOLDER_RR", joinColumns = { 
      @JoinColumn(name = "RR_FOLDER", referencedColumnName = "FR_ID") }, inverseJoinColumns = { 
        @JoinColumn(name = "RR_REQUEST", referencedColumnName = "RS_ID") }) 
    private List<Requests> requests = new ArrayList<Requests>(); 

} 

In meinem DAO:

@Override 
public Folders retrieveFolder(Long id) throws PersistenceException { 
    Folders folders = entityManager.find(Folders.class, id); 

    return folders; 
} 

So, wie ich es beheben kann in JPA? Was ist falsch, wenn ich meine Methode anrufen retrieveFolder?

Vielen Dank

Antwort

1

Sie müssen die Sammelanforderungen initialisieren.

Sie könnten folders.getRequests(). Iterator() aufrufen, die das Laden der Anfragen auslösen würde.

Aber der beste Weg ist eiter eine JPQL Abfrage mit einem JOIN FETCH auf Anfragen zu schreiben, dass die Sammlung mit Spannung geladen wird:

SELECT f FROM Folder f JOIN FETCH f.requests r 

oder ein EntityGraph verwenden, die das gleiche tun.

Schauen Sie sich die Hibernate-Dokumentation an und suchen Sie nach JOIN FETCH und EntityGraph.

http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html

+0

Ok, aber wenn ich JPQL Abfrage mit einem JOIN FETCH, meine Wünsche für die Antwort einige Zeit in Anspruch nehmen (5 sec) .. Aber wenn ich faul Last verwende ich eine gute Leistung haben .. Ich habe versucht, hinzuzufügen folders.getRequests(). iterator() in meiner Methode, aber Anforderungen nicht geladen – user1814879

+0

Können Sie die SQL-Protokollierung aktivieren. Setzen Sie org.hibernate.SQL logger auf DEBUG und posten Sie die Abfrage, die mit JOIN FETCH ausgeführt wird. Haben Sie einen Index für den Fremdschlüssel? –

+0

Ich habe keinen Fremdschlüssel, ich mache eine Zuordnungstabelle FOLDER_REQUEST (IDFolder, IDRequest) – user1814879

Verwandte Themen