java - Spring JPA - How to force custom order of repository calls within a transaction -


using spring data jpa 1.11.6.release, have following trouble;

with simple 1-to-n relationship between them, have tablea, , tableb, a contains multiple b. , have repository of tableb custom delete method;

public interface brepository extends jparepository<tableb, string> {     @modifying     void deletebytablea(tablea tablea); } 

where deletes fk value, pk of tablea

in service class, use these;

@service public class theservice {      @autowired     private arepository arepository;     @autowired     private brepository brepository;      @transactional     public void deleteinsert(list<tableb> blist) {         tablea tablea = arepository.findbyetc(...);         brepository.deletebytablea(tablea);         brepository.save(blist);     } } 

but issue order of operations inside @transactional method changes according optimization done hibernate. causing unique constraint violations, in case have duplicate entities of tableb exist in new table. if put brepository.count() call between delete & save calls, forces custom order, i'd achieve configuration rather such silly tricks. there way achieve this?

it seems answer problem lies in hibernate docs order of flush operation. according hibernate javadocs sql operations order is:

  • inserts
  • updates
  • deletions of collections elements
  • inserts of collection elements
  • deletes

you may want flush manually after first operation:

@transactional public void deleteinsert(list<tableb> blist) {     tablea tablea = arepository.findbyetc(...);     brepository.deletebytablea(tablea);     brepository.flush();      brepository.save(blist); } 

or try replace "delete + insert" operation update operation.


Comments