У меня возникла проблема с управлением транзакциями с собственными запросами в JPA в bean-компоненте Faceless. Я использую JBoss EAP 6.2 и базу данных Oracle 11g, а в качестве инфраструктуры JPA я использую Hibernate. Datasource настроен под JBoss с драйвером JDBC от Oracle. У меня есть один метод, который должен удалить что-то в базе данных, а затем обновить другие записи в одной транзакции. Ниже я поставил упрощенный код, чтобы сделать это:JPA + EJB: транзакции с родными запросами
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class MappingsDAO {
@PersistenceContext
protected transient EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void updateMappings(int id, Set<String> ids) {
Query query = em.createNativeQuery("DELETE FROM MAPPINGS M WHERE M.ID = :id");
query.setParameter("id", id);
query.executeUpdate();
query = em.createNativeQuery("UPDATE MAPPINGS M SET M.ID = :id WHERE M.MAPID IN (:ids)");
query.setParameter("id", id);
query.setParameter("ids", ids);
query.executeUpdate();
}
}
Когда выполнение этого кода удалить запрос выполняется, а затем обновить запрос намеренно не удалось показать, что транзакция не работает правильно, но откат в этом случае не работает, потому что операция удаления не была отменена.
Я также попытался изменить FlushModeType к COMMIT, добавив следующую строку:
em.setFlushMode(FlushModeType.COMMIT);
, но это также не имеет никакого эффекта. Я также пытался использовать транзакции, управляемые BEAN, и управлять транзакциями вручную, но с тем же эффектом.
Кто-нибудь знает, как решить эту проблему?
Почему вы используете собственный запрос, когда вы можете просто написать HQL-запрос в этом случае? Пожалуйста, дайте больше информации об ошибке, возможно, трассировке стека. –
Причина использования собственных запросов заключается в том, чтобы немного улучшить процесс обновления - меньше запросов для запуска в базе данных. Я повторно реализовал это решение, чтобы использовать объекты и правильно настроить каскады на этих объектах, и теперь он работает нормально. Проблема с решением, описанным здесь, заключается в том, что в журналах все выглядит нормально, но состояние в базе данных неверно. Спасибо за ваш комментарий. Это помогает мне изменить свое мышление о проблеме и попробовать совершенно другое решение. – Marek