Ich habe zwei Methoden:JPA Transaktion nicht am Ende des Verfahrens commiting
1:
@Transactional
public Long add(Long clientId) {
Contact contact = new Contact();
contact.setClientId(clientId);
contact.setValue('[email protected]');
contact.setType('EMAIL');
contact.setDateStart(new Date());
// autowired repo
return contactRepository.saveAndFlush(contact);
}
2:
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void emailsValidator(Long clientId) {
Specification<Client> spec = ClientSearchSpecification.getByClientIdWithActiveEmails(clientId);
List<Client> clientList = clientRepository.findAll(spec);
}
SearchSpecification:
public static Specification<Client> getByClientIdWithActiveEmails(Long clientId) {
return (root, query, cb) -> {
query.distinct(true);
Join<Client, Contact> clientContactJoin = (Join) root.fetch(Client_.contactList);
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.get(AbstractEntity_.id), clientId));
predicates.add(cb.equal(clientContaktJoin.get(Contakt_.type), 'EMAIL'));
predicates.add(cb.lessThan(clientContaktJoin.get(Contakt_.dateStart), cb.currentTimestamp()));
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
}
Main-Methode:
@RequestMapping(value = "/{clientId}/contact/add", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public void addContact(@PathVariable(value = "clientId") Long clientId) {
contactService.add(clientId);
errorValidationService.emailsValidator(clientId);
}
Meine db Eigenschaften:
hibernate.transaction.auto_close_session: true
hibernate.connection.autocommit: true
org.hibernate.flushMode: COMMIT
Das Problem - DB doesn Wenn Sie Schritt 2 ausführen, enthält das Objekt keine neue Entität aus Schritt 1. Das Objekt wird erst nach Abschluss aller restlichen Aufrufe übergeben. Wie verpflichte ich die Entität in Schritt 1, sodass ich sie in Schritt 2 auswählen und ihr beitreten kann?
Konnten Sie den Code bekannt geben, der die zwei Methoden aufruft? –