2017-12-20 4 views
0

의 컬렉션을 초기화하지 못했습니다 그리고 난 게으른에 부하 법인을 싶습니다하지만 난 오류가있어 :오류 지연로드 : com.fasterxml.jackson.databind.JsonMappingException는 : 게으르게 내가 컬렉션에 엔터티가 역할

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 

그리고 내 엔티티와 같은 : 내 DAO에서

@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>(); 

} 

: 그래서

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

    return folders; 
} 

나는 그것을 해결하는 방법 JPA에서? 내 메서드를 호출 할 때 무엇이 ​​잘못 되었습니까? retrieveFolder?

감사합니다.

답변

1

수집 요청을 초기화해야합니다.

요청로드를 트리거하는 folders.getRequests(). iterator()를 호출 할 수 있습니다.

그러나 가장 좋은 방법은있는 JPQL 쿼리를 작성하는 eiter하는 열망이 모음을로드 요청에 FETCH 가입 :

SELECT f FROM Folder f JOIN FETCH f.requests r 

을 또는 동일한 작업을 수행하는 EntityGraph를 사용하여.

Hibernate 문서를보고 JOIN FETCH 및 EntityGraph를 검색하십시오.

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

+0

좋아,하지만 난과 JPQL 쿼리를 사용하는 경우 내가 추가하려고 .. 내 요청 응답 (5 초)에 대한 몇 가지의 시간이 걸릴 ..하지만 게으른 부하를 사용하는 경우 내가 좋은 성능을 가지고 FETCH JOIN folders.getRequests(). 내 메소드의 iterator()가로드되지 않았습니다. – user1814879

+0

SQL 로깅을 켤 수 있습니까? org.hibernate.SQL 로거를 DEBUG로 설정하고 get이 JOIN FETCH와 함께 실행 된 쿼리를 게시하십시오. 외래 키에 대한 색인이 있습니까? –

+0

외래 키가 없습니다. 연관 테이블 FOLDER_REQUEST (idFolder, idRequest) – user1814879

관련 문제