2011-12-05 3 views
1

@Transactional annotation을 사용하여 서비스 계층에서 트랜잭션을 관리하기 위해 Spring을 사용하고 있습니다. 열심히로드 된 컬렉션에는 적합하지만 지연로드에는 적합하지 않습니다.Hibernate와 Spring, Lazy 모드에있는 콜렉션을로드하십시오.

OSV 패턴을 사용할 수 없습니다. 내 응용 프로그램은 독립형 데스크톱 클라이언트 응용 프로그램입니다.

그래서 나는 해결책에 대해 생각하고,이는 내가하려고 무엇을 : 내가 가지고있는

public abstract class TransactionTask { 

    public TransactionTask() { 
    } 

    public abstract void job(); 
} 

을 내 서비스 :

@Transactional 
public void doJob(Transactiontask tt){ 
    tt.job(); 
} 

그리고는 어떻게 사용

myService.doJob(new TransactionTask() { 

    @Override 
    public void job() { 
     //lazy code here 
    } 
}); 

세션이 doJob 메소드에서 열려 있기 때문에이 코드가 작동 할 것으로 예상됩니다 (트랜잭션으로 표시됨).),하지만 작동하지 않습니다 ... 예외는 no session or session was closed입니다. 이 코드가 작동하지 않는 이유와 필요에 따라 컬렉션을로드하는 방법은 무엇입니까?

컬렉션을로드하는 지정된 메소드로 서비스를 작성하고 싶지는 않습니다. 솔루션이 아닙니다.

답변

3

게으른로드 그냥 세션을 필요로하지 않습니다, 그것은 당신의 Entity가 부착되어 세션을 필요로한다. 게으른 필드에 액세스하기 전에 @Transactional에 의해 생성 된 새 세션에 개체를 연결해야합니다.

또한 OSIV 서블릿 필터 중 하나를 분명히 사용할 수는 없지만 '패턴'은 여전히 ​​유효합니다. 세션의 수명주기를 연결할 수있는 정의 가능한 범위가 있어야합니다. (그것은 너무 커서 많은 노력을 할 가치가없는 다른 도전 과제가 있지만 여전히 선택 사항입니다.)

0

예. 당신은 User user 개체가 있습니다. 그것은 분리 되었기 때문에 "예외가없는 세션이나 세션이 닫혔습니다"라는 이유가 있습니다.

dao user=userDao.findById(user.getId())에서 다시 읽은 다음 새로 검색 한 개체의 게으른 모음을 가져올 수 있습니다.

관련 문제