【发布时间】:2016-08-30 02:02:29
【问题描述】:
我有两种方法:
1:
@Transactional
public Long add(Long clientId) {
Contact contact = new Contact();
contact.setClientId(clientId);
contact.setValue('test@test.com');
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()]));
};
}
主要方法:
@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);
}
我的数据库属性:
hibernate.transaction.auto_close_session: true
hibernate.connection.autocommit: true
org.hibernate.flushMode: COMMIT
问题 - DB 在执行步骤 2 时不包含来自步骤 1 的新实体。仅在所有 rest 调用完成后才提交对象。如何在第 1 步提交实体,以便在第 2 步中选择并加入它?
【问题讨论】:
-
能否贴出调用这两种方法的代码?
标签: spring hibernate commit flush transactional