Я работаю над весенним приложением, которое использует сеанс гибернации для каждой модели запроса. Я сталкиваюсь с проблемой, когда даже после сохранения и сброса сущности в одном потоке второй поток не может найти ту же сущность.
public synchronized Entity generateAndSaveEntity() {
log.debug("Generating entity");
final Entity entity = repository.getLatestEntity();
log.info("Existing Entity: {}", entity);
final Invoice savedEntity = repository.saveAndFlush(invoice);
log.debug("Saved Entity: {}", repository.getLatestEntity());
return savedEntity;
}
Метод драйвера выглядит следующим образом:
@Test
public void testEntityCreation_parallelRequests_generatesUniqueEntities() {
CompletableFuture<Entity> r1 = CompletableFuture.supplyAsync(
() -> generateAndSaveEntity());
CompletableFuture<Entity> r2 = CompletableFuture.supplyAsync(
() -> generateAndSaveEntity());
CompletableFuture<Void> future = CompletableFuture.allOf(r1, r2)
.thenRunAsync(() -> assertEntitiesAreUnique(r1.join(), r2.join()));
future.join();
}
Бревна
2019-10-31 21:24:46.158 INFO 51046 --- [onPool-worker-2] c.h.a.k.s.impl.DefaultService : Generating entity
2019-10-31 21:24:46.192 INFO 51046 --- [onPool-worker-2] c.h.a.k.s.impl.DefaultService : Existing Entity: Optional.empty
2019-10-31 21:24:46.332 INFO 51046 --- [onPool-worker-2] c.h.a.k.s.impl.DefaultService : Saved Entity: Optional[Entity(foo=bar)]
2019-10-31 21:24:46.332 INFO 51046 --- [onPool-worker-1] c.h.a.k.s.impl.DefaultService : Generating entity
2019-10-31 21:24:46.334 INFO 51046 --- [onPool-worker-1] c.h.a.k.s.impl.DefaultService : Existing Entity: Optional.empty
2019-10-31 21:24:46.369 INFO 51046 --- [onPool-worker-1] c.h.a.k.s.impl.DefaultService : Saved Entity: Optional[Entity(foo=bar)]