2011-04-01 4 views
1

Eclipselink와 함께 Glassfish 3.1을 JPA 공급자로 사용할 수 있습니다. 다음 코드와 함께 상태없는 빈을 얻었고 테이블에 매핑 된 Folder 클래스를 얻었다. 각 폴더는 상위 폴더를 가질 수 있습니다.JPA 지연로드 이해

다음과 같은 코드가있는 Stateless Bean입니다.

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public List<Folders> getUserFolders() { 
    return folderDao.findFolders(); 
    } 

그리고 엔티티 클래스

public class Folder { 

    @ManyToOne(fetch=FetchType.LAZY) 
    private Folder parent; 

    @OneToMany(targetEntity=Folder.class, mappedBy="parent", fetch=FetchType.LAZY) 
    private List<Folder> childFolders; 

} 

은 상황에 따라 고려, 서블릿() 메소드를 모든 폴더를 얻고 폴더 호출 getChildFolders을 통해주기를의 반복이 빈을 호출합니다.

FINEST: Connection acquired from connection pool [read]. 
FINEST: reconnecting to external connection pool 
FINE: SELECT ID, FOLDERNAME, POSITION, OWNER_ID, PARENT_ID FROM t_user_folder WHERE (PARENT_ID = ?) 
    bind => [1 parameter bound] 
FINEST: Connection released to connection pool [read]. 

getChildFolders() 메서드 호출은 트랜잭션 메서드 외부에서 발생하므로 영구 컨텍스트가 이미 플러시됩니다. 그리고 왜 LazyInitializationException이 던져지지 않고 컨테이너가 어디에서 연결을 가져야 하는지를 어떻게 알 수 있는지 이해할 수 없습니다. 누군가가 그것을 설명해 줄 수 있습니까

+0

'EntityManager'의'PersistenceContextType'은 무엇입니까? – CMR

답변

6

글쎄,이 상황은 eclipselink 아키텍처에서 발생합니다 .. Eclipselink JPA 구현 stil은 기존 Toplink 세션 아키텍처를 사용합니다. 비 트랜잭션 작업을 위해 새로운 클라이언트 세션이 생성됩니다 이 서버 세션은 트랜잭션 연산을 위해 UnitOfWork 세션이 생성됩니다 .. 귀하의 경우에는 트랜잭션을 필요로하지 않습니다. 단지 읽기 작업 일 뿐이므로 ... 엔티티와 호출 병합 메소드를 변경하면 예외가 발생합니다 .. 자세한 내용은 다음을 참조하십시오. this link