1

In my Spring boot application i need to read data from a specific schema and write on another one, to do so i follow this guide (https://github.com/spring-projects/spring-data-examples/tree/main/jpa/multitenant/schema) and i used this answer (https://stackoverflow.com/a/47776205/10857151) to be able to change at runtime the schema used.

But if this works fine inside a service without any transaction scope, this doesn't works on a more complex architecture (exception: session/EntityManager is closed) where there are couple of service that share transaction to ensure rollback. THE BELLOW IS A SIMPLE EXAMPLE OF THE ARCHITECTURE

//simple jpa repository
private FirstRepository     repository;
private SecondRepository    secondRepository;
private Mapper              mapper;
private SchematUpdater      schemaUpdater;

@Transactional
public void entrypoint(String idSource,String idTarget) {
    //copy first object
    firstCopyService(idSource, idTarget);
    //copy second object
    secondCopyService(idSource, idTarget);
}

@Transactional
public void firstCopyService(String idSource,String idTarget) {
    //change schema to the source default
    schemaUpdater.changeToSurceSchema();
    Object obj=repository.get(idSource);
    //convert obj before persist - set new id reference and other things
    obj=mapper.prepareObjToPersist(obj,idTarget);
    //change schema to the target default
    schemaUpdater.changeToTargetSchema();
    repository.saveAndFlush(obj);
}

@Transactional
public void secondCopyService(String idSource,String idTarget) {
    schemaUpdater.changeToSurceSchema();
    Object obj=secondRepository.get(idSource);
    //convert obj before persist
    obj=mapper.prepareObjToPersist(obj);
    //change schema to the target default
    schemaUpdater.changeToTargetSchema();
    secondRepository.saveAndFlush(obj);
}

I need to know what could be the best solution to ensure this dynamical switch and maintain the transaction scope on each service, without causing problems connected to restore and clean entity manager session.

Thanks

Michael Cauduro
  • 185
  • 1
  • 3
  • 16

0 Answers0