2011-10-04 5 views
1

컨테이너 관리 트랜잭션이있는 Stateless Session Bean이 있습니다. 관리되지 않는 엔티티를 데이터베이스에서 생성 (지속) 한 후에 반환하려고합니다. 즉, 내가 할 방법은 다음과 같습니다persist 후에 분리 한 경우 엔터티를 찾을 수없는 이유

@Stateless 
public class MyBean { 

    @EJB(name="MyController") 
    private MyController myController; 

    public MyEntity create(MyEntity entity) { 
     //... 
     myController.create(entity); 
     myController.preTransfer(entity); 
     return entity; 
    } 
} 
@Stateless 
public class MyController { 

    @PersistenceContext(unitName = "myPU") 
    private EntityManager em; 

    public void create(MyEntity entity) { 
     //... 
     em.persist(entity); 
    } 

    public void preTransfer(MyEntity entity) { 
     if (em.contains(entity)) { 
      em.detach(entity); 
     } 
     //... 
    } 
} 

나는 MyBean.create 전화, 개체가 성공적으로 지속 및 MyBean.create 반환되지 않는 개체, 그건 괜찮아요. 그러나 다음에 ID로이 엔티티를 검색하려고하면 찾을 수 없습니다. 내가 을 분리하면 엔티티를 찾을 수 있지만 MyBean.create이 경우 엔티티를 반환하십시오. 내가 틀린 곳?

답변

2

EntityManager.detach 상태의 javadoc는 :합니다 ( 엔티티의 제거 포함)가

그래서 당신이있어 데이터베이스에 동기화되지 않습니다 경우 엔티티로 만든

h 제되지 않은 변경 그것을 지속하고, 그것을 떼어 낸다. 그러나 지속과 관련된 작업은 아직 플러시되지 않았으므로 엔터티는 데이터베이스에 저장되지 않습니다.

왜 분리 하시겠습니까? 트랜잭션이 끝나 자마자 자동으로 분리됩니다.

+0

비즈니스 메서드에서 반환하기 전에 엔터티 필드를 일부 설정해야하므로 엔터티를 분리해야합니다. –

+0

엔터티 대신 데이터 전송 개체를 반환하려는 것처럼 들립니다. 왜 DB에 상태를 나타내지 않는 엔티티를 반환하겠습니까? –

+0

@TuukkaMustonen 분리 된 엔티티를 가져 오는 목적으로 DTO를 도입하는 것은 EJB 2.1 또는 이전 버전이 아니라면 정말 나쁜 생각입니다. 엔티티가 직렬화 가능하다고 생각하는 이유는 무엇입니까? – MaDa

0

JB의 답변을 개정 : 당신은뿐만 아니라 분리 또는 명시 적으로 플러시 컨테이너를 시작하지 않고, 깨끗하고, 표준 메커니즘을 사용할 수

@Stateless 
public class MyController { 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public MyEntity create(MyEntity entity) { 
     //... 
     em.persist(entity); 
     return entity; 
    } 
} 

당신은 결과로 분리 된 개체를 얻을 수 있습니다.

+0

그래,이 경우 작동합니다. 그러나 JPA는 중첩 된 트랜잭션을 지원하지 않으므로 더 복잡한 경우에는 작동하지 않습니다. 예를 들어 다른 엔티티를 만들고 싶습니다. 관리되지 않는 상태로 작업하고 모든 엔티티를 동일한 트랜잭션에서 만들고 싶습니다. –

관련 문제