2017-03-20 3 views
3

TestNG + Spring + Hibernate를 사용합니다. 내가 @BeforeClass에서 트랜잭션을 사용하는 경우 , 내가 얻을 :TestNG @BeforeClass에서 트랜잭션을 어떻게 사용할 수 있습니까?

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 

코드 예제 :

@Transactional(transactionManager = "transactionManager") 
@Rollback 
@ContextConfiguration(locations = "/WEB-INF/testing/applicationTestContext.xml") 
@TestExecutionListeners(listeners = { 
     ServletTestExecutionListener.class, 
     DependencyInjectionTestExecutionListener.class, 
     DirtiesContextTestExecutionListener.class, 
     TransactionalTestExecutionListener.class, 
     SqlScriptsTestExecutionListener.class, 
     WithSecurityContextTestExecutionListener.class 
}) 
public abstract class ExampleOfTest extends AbstractTestNGSpringContextTests{ 
    @Autowired 
    private SessionFactory sessionFactory; 

    @BeforeClass 
    public void setUpClass() { 
     sessionFactory.getCurrentSession().beginTransaction(); // get HibernateException 
     sessionFactory.getCurrentSession().getTransaction().commit(); 
    } 

    .... 

} 

내가 @BeforeClass에서 트랜잭션을 사용할 수 있습니다 어떻게? 모든 클래스 테스트에서 사용한 일회성 데이터 입력에이 코드를 사용하고 싶습니다.

답변

1

문제는 그것은 활성 트랜잭션에서 실행해야합니다,

또는

같은 제한

// BMT idiom with getCurrentSession() 
try { 
    UserTransaction tx = (UserTransaction)new InitialContext() 
          .lookup("java:comp/UserTransaction"); 

    tx.begin(); 

    // Do some work on Session bound to transaction 
    sessionFactory.getCurrentSession().persist(...); 

    tx.commit(); 
} 
catch (RuntimeException e) { 
    tx.rollback(); 
    throw e; // or display error message 
} 

getCurrentSession 뭔가를 시도 @EnableTransactionManagement이 스프링 컨텍스트에 있어야 할 것이다.

나는 이것이 도움이 될 것이라고 생각합니다.