2012-01-05 2 views
4

JBoss AS 6에서 JBoss AS 7로 마이그레이션 프로세스를 진행하고 있으며 테스트에 문제가 있습니다. 의 간단한 엔티티 EJB 가정 해 보자 :에서JBoss AS 7에서 PersistenceException 또는 ConstraintViolationException을 catch합니다.

@Entity public class MyTest implements Serializable 
{ 
    @Id @GeneratedValue(strategy=GenerationType.AUTO) 
    private long id; 

    @NotNull 
    private String headline; 
} //getter/setter 

을 내 @Stateless Bean 내가 (전 JBoss5 및 JBoss6와 같은) 이런 식으로 뭔가를하고 있어요 :

@Inject private EntityManager em; 

public <T extends Object> T persist(T o) throws MyContraintViolationException 
{ 
    System.out.println("***************** persist:"); 
    try 
    { 
     em.persist(o); 
    } 
    catch (Exception e) 
    { 
     System.out.println("*************** exception:"); 
     // Further investigation of Exception e, 
     // then throw MyContraintViolationException 
    } 
} 

난을 위반하지 않은 경우이 잘 작동 @NotNull 제약 조건. headline==null 경우에, 나는 예외를 얻을,하지만 내 catch 블록 입력하지 않습니다

12:19:45 INFO ******************** persist: 
12:19:45 WARN [com.arjuna.ats.arjuna] (management-handler-threads - 2) 
    ARJUNA012125: TwoPhaseCoordinator.beforeCompletion - failed for 
    SynchronizationImple< 0:ffffc0a801fb:4f969a6e:4f058744:9, 
    org.hibernate.engine.transaction.synchronization.internal. 
    [email protected] >: javax.persistence.PersistenceException: 
    error during managed flush 
... 
Caused by: javax.validation.ConstraintViolationException: Validation failed for 
    classes [my.test.MyTest] during persist time for groups 
    [javax.validation.groups.Default, ] List of constraint violations:[ 
    ConstraintViolationImpl{interpolatedMessage='kann nicht null sein', 
    propertyPath=headline, rootBeanClass=class my.test.MyTest, 
    messageTemplate='{javax.validation.constraints.NotNull.message}'} 

나는 오류 메시지가 보스의 이전 버전보다 훨씬 더 자세한 것을 볼 수 행복 해요,하지만 내가 어떻게 할 수 javax.validation.ConstraintViolationException을 붙잡고 내 자신을 던져 MyContraintViolationException? 심지어 디버그 메시지 ***** exception이 아니며이 인쇄되어 있습니다. 당신이 메시지와 예외의 스택 트레이스를 읽는다면

답변

11

,이 예외가 지속 호출에 의해 슬로우되지 않는 것을 볼 수 있지만 것 플러시하여 :시

오류 관리

플러시

persist는 쿼리를 발행하지 않으며 데이터베이스에 아무것도 저장하지 않습니다. 단지 엔티티 관리자에게 일시적인 엔티티를 영속화하도록 요청합니다. 플러시 시간 (트랜잭션의 커밋 직전, 또는 Hibernate가 올바른 결과를 리턴하기 위해이 엔티티가 데이터베이스에 있어야하는 질의를 실행하기 전에 또는 flush()이 명시 적으로 호출 될 때) 제약 조건이 검사되고 삽입 쿼리가 실행됩니다.

flush를 명시 적으로 호출 할 수도 있지만, Hibernate가 여러 쿼리를 일괄 처리하지 않고 필요한 경우에만 실행하게함으로써 응용 프로그램의 성능에 영향을 미칩니다. 난 그냥 기본 예외를 사용합니다. 그런 전환이 필요한 이유는 무엇입니까?

0

EJB를 사용하여 entityManager를 포함하고 있습니다. Stateless EJB에 대한 모든 메소드 호출은 트랜잭션으로 래핑됩니다.

EntityManager를 삽입했습니다. 이것은 EntityManager가 트랜잭션의 일부가 될 것임을 의미합니다. EntityManager는 트랜잭션 커밋 중에 만 플러시되므로이 오류 메시지가 표시되지 않습니다.

@Inject private EntityManager em; 

public <T extends Object> T persist(T o) throws MyContraintViolationException 
{ 
System.out.println("***************** persist:"); 
em.persist(o); 
try 
{ 
    em.flush(); 
} 
catch (Exception e) 
{ 
    System.out.println("*************** exception:"); 
    // Further investigation of Exception e, 
    // then throw MyContraintViolationException 
} 
} 
:

당신이해야 할 것은 다음과 같다

관련 문제