У нас проблемы с управлением транзакциями в Spring 3.0.5 и OpenJPA 2.0.1, и мы не можем точно определить проблему, поэтому любая помощь приветствуется.
Архитектура может быть поврежденаследующим образом:
сервис-уровень
@Autowired
private DAOInterface daoReference;
....
public void doStuff() {
boolean test = performCheck();
}
....
private boolean performCheck() {
return daoReference._performDAOCheck();
}
DAO-уровень
@PersistenceContext
private EntityManager entityManager;
.....
@Transactional
public boolean _performDAOCheck() {
boolean result = true;
// fetch entity manager, perform something and return boolean value
return result;
}
Этот код выполняет следующие действия:Следует, но нам действительно не нравится существование транзакционной демаркации на уровне DAO, и мы хотели бы перенести это на уровень обслуживания выше.
Однако если мы переместим аннотацию @Transactional
в метод делегата уровня обслуживания и удалим его из уровня DAO, мы получим javax.persistence.TransactionRequiredException
, который указывает, что транзакция требуется, но не активна.
Вопрос - почему и как мы «активируем» транзакцию из метода делегата?Напомним, что мы пробовали различные модификаторы распространения транзакций, но, похоже, они ничего полезного не сделали (REQUIRES_NEW - единственное, что на самом деле применимо в этом контексте, но мы пытались использовать другие просто для того, чтобы быть в безопасности).
Стек приложений выглядит следующим образом:
- Spring 3.0.5
- Bitronix 2.1.1
- OpenJPA 2.0.1
- Tomcat6.0.32
- В качестве среды тестирования используется JUnit 4.8.2