Yo uso TestNG + Spring + hibernación. Cuando uso la transacción en @BeforeClass, obtengo:
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current threadEjemplo de código:
@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(); } .... }¿Cómo puedo usar la transacción en @BeforeClass? Quiero usar esto para la entrada de datos de una sola vez utilizada en todas las pruebas de clase.
El problema sería que @EnableTransactionManagement debería estar en su contexto de primavera
o
Prueba algo como
// 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 es como restringido, debería ejecutarse en una transacción activa.
Creo que esto puede ayudar.