JPA. Update dml doesn't work with @Transactional annotation

Viewed 20

I tryng to perform an an unpdate within a UnitTest method with org.springframework.transaction.annotation.Transactional annotation, but it seems that the update doesn't work.

If I remove @Transactional annotation on the method, the update works succesfully but it is visible for all others tests too.

Could you please indicate to me where I'm wrong?
I need the update effective only within the method with the @Transactional annotation and not visible for all others methods.

I'm using Srping boot v 2.6.6. to start the application. I use JPA and Oracle Data Base.
This is my repository class where I use native query.

@Repository
@Transactional
public interface EsercentiRepository extends JpaRepository<EsercentiEntity, Long> {
    
        // Update
        @Modifying
        @Query(value="update esercenti set sslfl=:sslfl where id_conv=:idConv", nativeQuery=true)
        public void updateSslFlagByIdViaQuery(@Param("idConv") long idConv, @Param("sslfl") String sslfl);

        // select
        @Query(value="select id_conv,c_code,vendor_id,pos_id,abi_code,funzioni,ds,pos_id_sia,rifmer3d,sslfl "
                     + " from esercenti where id_conv=:idConv", nativeQuery=true)
        public EsercentiEntity getEsercentiByIdConvViaQuery(@Param("idConv") long idConv);
}

This is my Service class.

@Service
@Transactional
public class EsercentiServices implements IEsercenti {
    
    @Autowired
    private EsercentiRepository esercentiRepository;
    
    @Override
    public void updateSslFlagByIdViaQuery(long idConv, String sslfl) throws Exception {
        esercentiRepository.updateSslFlagByIdViaQuery(idConv, sslfl);
    }
    
    @Override
    public EsercentiEntity getEsercentiByIdConvViaQuery(long idConv) throws Exception {
        return esercentiRepository.getEsercentiByIdConvViaQuery(idConv);
    }
}

And this is my SpringBootTest class located in the 'test' directory where I use Junit 5 to perform Functional tests.

@EnableTransactionManagement
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@ExtendWith(SpringExtension.class)
@SpringBootTest
class TestGpay extends BaseServiceTester {

    @Autowired
    private IEsercenti esercentiServices;
    
[..]

    @Test
    @Transactional
    public void TestDirectAuthGpayWithPayload(TestInfo testInfo) {
        try {
            // [..... Some codes]
    
            EsercentiEntity ese = esercentiServices.getEsercentiByIdConvViaQuery(7826L);            
            esercentiServices.updateSslFlagByIdViaQuery(7826L, "Y");
            EsercentiEntity ese2 = esercentiServices.getEsercentiByIdConvViaQuery(7826L);           
    
            // Send the http request. I expect to find the data changed on DB as per above update, but it is not.
            WebUtils.HttpResponse response = netsJsonClient(endPoint, "POST", jsonObjectRequest.toString(), merId, merIdKsig);
    
                        // If I cancel the @Transactoinal annotation on the method level, the update is ok, 
                        // but it is a global update and not only related to this database session.
        } catch (Exception e) {
            e.printStackTrace();
            closeDriver(driver);
            fail("Exception on test case " + testInfo.getDisplayName() + " Full Error:" + e);
        }
    }

Thanks in advance.

0 Answers
Related