2013-06-20 3 views
2

스테이크리스 세션 빈에서 사용되는 JPA와 함께 OptimisticLockException에 관한 두 가지 질문을 여기서 보았습니다. 그것은 던져진다. 그러나 내가 분명히 그것을 기대하는 곳이 아니다. 여기 JPA에서 OptimisticLockException을 잡는 방법

내가 예외를 얻을 것으로 예상되는 코드 :

  try 
      { 
       productFacade.edit(product); 
      } 
      catch(Exception { 
       return "lock"; 
      } 

productFacade이 넷빈즈와 함께 생성되고 그것은 로컬 인터페이스를 가진 EJB이다는 IT가 AbstractFacade 추상 클래스를 구현합니다. 지금까지 내가 읽은 한, JPA의 트랜잭션과 관련이 있습니다. edit()이 호출 된 이후가 아니라이 코드 단편이있는 메소드가 남아있는 후에 예외가 발생하기 때문입니다. 어디에서 예외를 처리해야합니까?

또한 여러 제품을 업데이트해야하거나 일부 제품이 잠겨있는 경우 트랜잭션 메커니즘이 필요합니다. 몇 가지 코드 예제를 찾았지만 트랜잭션을 어떻게 처리해야하는지 궁금합니다.

+0

더 많은 코드를 추가 할 수 있으며 관련 코드가 표시되지 않고 트랜잭션이 관리되는 방식, 다음 트랜잭션이 동일한 트랜잭션 내에서 실행되는 방식 등이 있습니다. –

+0

JTA 및 컨테이너 기반 트랜잭션을 사용하고 있습니다. 나는 빈 제어 트랜잭션으로 전환을 시도하고 내 자신의 트랜잭션을 관리했지만 실제로 도움이되지 못했습니다. 다음 트랜잭션이 같은 트랜잭션 내에서 실행되는지 어떻게 확인할 수 있습니까? –

+0

이전에 언급했듯이 관련 코드가있는 게시물을 업데이트하면 모든 사용자에게 도움이됩니다. –

답변

4

트랜잭션이 커밋 될 때까지 잠금 오류가 발생하지 않습니다. 따라서 SessionBean 외부에서 처리하거나 컨테이너 관리 트랜잭션을 사용해야합니다.

또는 JPA EntityManager에서 flush()를 호출하면 오류가 발생합니다.

+0

컨테이너 관리 트랜잭션을 사용하고 있습니다. 클라이언트에서 세션 빈에서 예외를 잡을 수있는 곳은 어디입니까? 컨테이너가 관리하는 트랜잭션의 경우 트랜잭션이 실제로 시작 및 끝나는 시점은 언제입니까? 하나의 메소드에서 여러 개의 병합을 수행하는 경우 메소드가 종료 된 후 트랜잭션으로 간주됩니까? –