2015-03-03 3 views
1

У меня возникла проблема с управлением транзакциями с собственными запросами в 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, и управлять транзакциями вручную, но с тем же эффектом.

Кто-нибудь знает, как решить эту проблему?

+0

Почему вы используете собственный запрос, когда вы можете просто написать HQL-запрос в этом случае? Пожалуйста, дайте больше информации об ошибке, возможно, трассировке стека. –

+0

Причина использования собственных запросов заключается в том, чтобы немного улучшить процесс обновления - меньше запросов для запуска в базе данных. Я повторно реализовал это решение, чтобы использовать объекты и правильно настроить каскады на этих объектах, и теперь он работает нормально. Проблема с решением, описанным здесь, заключается в том, что в журналах все выглядит нормально, но состояние в базе данных неверно. Спасибо за ваш комментарий. Это помогает мне изменить свое мышление о проблеме и попробовать совершенно другое решение. – Marek

ответ

2

Одна типичная проблема заключается в том, что PersistenceUnit не является JTA. Вы должны пометить его как JTA как в вашем файле persistence.xml, так и в вашей конфигурации JBoss (DataSources).

+0

Точно. Это была проблема. После обновления источника данных в JBoss для «Использования JTA» транзакции начнут работать правильно. Благодаря! – Marek

Смежные вопросы