В настоящее время я испытываю управляемый приложением контекст персистентности, создавая менеджер сущностей вручную и сохраняя их, чтобы включить транзакцию, которая охватывает несколько вызовов (например, расширенный контекст персистенции) в приложении JSE.
Но,Мне интересно, могу ли я избежать отправки объекта entityManager по всему сервису и методам DAO в качестве дополнительного параметра, используя инъекцию пружины @PersistenceContext и пометив методы аннотацией @Transactional, чтобы использовать транзакцию, начатую вручную с этим менеджером сущностей.
Я думаю, что я могу как-то справиться с этим, используя ThreadLocal для этой функции, но я буду счастлив, когда смогу прикрепить это к весенней структуре.
Это пример того, что у меня естьв виду:
Метод действия пользовательского интерфейса:
Здесь мы видим, что транзакция запускается логикой пользовательского интерфейса, поскольку в бэкэнде нет метода фасадов / команд для группировки этихпризывы кбизнес-логика:
Long transactionid = tool.beginTransaction();
// calling business methods
tool.callBusinessLogic("purchase", "receiveGoods",
paramObject1, transactionid);
tool.callBusinessLogic("inventory", "updateInventory",
paramObject2, transactionid);
tool.commitTransaction(transactionid);
Внутри инструмента:
public Long beginTransaction() {
// create the entity --> for the @PersistentContext
Entitymanager entityManager = createEntityManagerFromFactory();
long id = System.currentTimeMillis();
entityManagerMap.put(id, entitymanager);
// start the transaction --> for the @Transactional ?
entityManager.getTransaction().begin();
return id;
}
public void commitTransaction(Long transactionId) {
EntityManager entityManager = entityManagerMap.get(transactionId);
entityManager.getTransaction().commit();
}
public Object callBusinessLogic(String module, String function,
Object paramObject, Long transactionid) {
EntityManager em = entityManagerMap.get(transactionId);
// =================================
// HOW TO DO THIS????
// =================================
putEntityManagerIntoCurrentPersistenceContext(em);
return executeBusinessLogic(module, function, paramObject, transactionid);
}
И пример метода обслуживания:
public class Inventory {
// How can i get the entityManager that's been created by the tool for this thread ?
@PersistenceContext
private EntityManager entityManager;
// How can i use the transaction with that transactionId ?
@Transactional
public void receiveGoods(Param param) {
// ........
}
}
Есть ли способ достичь этого?
Спасибо!