Cześć, mam pewien kłopot, a mianowicie.. Mam pewien trigger na bazie, który przy zapisie klasy C
sprawdza czy istnieje obiekt w bazie B
o danym businessId
. Tak więc postanowiłem zrobić to tak: zapisuję klasę A
oraz B
(Cascade.PERSIST
) poprzez saveAndFlush()
ze Spring Data JPA, a następnie zapisuję klasę C
wcześniej wyciągając dane o klasie B - biorąc jej ID. Natomiast po dokładnym debugowaniu po linii saveAndFlush()
nie mam jeszcze w bazie rekordów klasy A
oraz B
, przez co przy zapisie C
i tak wywala się trigger, że brak jest takiego rekordu B
o takim businessId
- jak to rozwiązać? saveAndFlush()
nie robi automatycznie commit'a do bazy? Rozegrać to jakoś @Transactional
? Jeśli tak to jak? Niżej jak to mniej więcej wygląda u mnie i co chcę osiągnąć. Przecież saveAndFlush()
w implementacji swojej ma domyślnie @Transactional
nad sobą, a więc powinien iść commit...
class A {
@OneToMany(CascadeType.PERSIST)
List<B> classesB;
addB(B b) {
classesB.add(b);
b.setA(this);
}
}
class B {
@ManyToOne
A classA;
@OneToMany(CascadeType.PERSIST)
List<C> classesC;
}
class C {
@ManyToOne //businessId - nie jest to PK
Long classBId;
}
class Service {
save() {
A a = Amapper.map();
aRepository.saveAndFlush(a);//Tutaj zapisuje A i B
B b = bRepository.findById();
C c = Cmapper.map(b);
cRepository.save(c);
}
}
class Amapper {
map() {
//settery
A a = new A();
Bmapper bMapper = new Bmapper();
B b = Bmapper.map();
a.addB(b)
}
}
class Cmapper {
map(B b) {
C c = new C();
c.setClassBId(b.getId());
}
}