В настоящее время я испытываю контекст сохраняемости, управляемый приложением, путем создания менеджера сущностей вручную и сохранения их, чтобы включить транзакцию, которая охватывает несколько вызовов запросов (возможно, что-то вроде расширенного контекста сохранения) в приложении JSE.
Но мне интересно, могу ли я избежать отправки объекта entityManager по всей службе и методов DAO в качестве дополнительного параметра, используя инъекцию Spring @PersistenceContext и помечая методы аннотацией @Transactional, чтобы использовать транзакцию, запущенную вручную с этим менеджером объектов.
Я думаю, что могу каким-то образом справиться с этим, используя ThreadLocal для этой функции, но я буду счастлив, если смогу прикрепить это к структуре Spring.
Это пример того, что я имею в виду:
Метод действия пользовательского интерфейса:
Здесь мы видим, что транзакция запускается логикой пользовательского интерфейса, поскольку в бэкэнде нет метода фасада/команды для группировки этих вызовов с бизнес-логикой:
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) {
// ........
}
}
Есть ли способ добиться этого?
Спасибо !