Управление исключениями EJB / JPA - PullRequest
2 голосов
/ 21 марта 2012

Вот моя проблема. Я работаю над пакетом синхронизации с использованием 2 модулей EJB / JPA / Hibernate.

Первый модуль считывает информацию в базе данных A и обнаруживает изменения. После обнаружения измененные элементы отправляются во второй модуль через JMS.

Второй модуль читает сообщение, просматривает измененные элементы и обновляет информацию в базе данных B.

Как только процесс обновления завершен, сообщение, содержащее идентификатор успешно обновленных элементов, отправляется первому модулю, который помечает в базе данных А успешно обновленные элементы.

Весь процесс работает, но я не знаю, как управлять исключениями, которые могут возникнуть во время процесса сохранения, с помощью управляемого контейнером EntityManager .

Если бы я не работал с управляемым контейнером EntityManager, я бы открывал новую транзакцию для каждой вставки и фиксировал ее или откатывал в зависимости от того, возникло ли исключение.

Мне нужно знать, когда произошло исключение, чтобы не добавлять идентификатор элемента, обрабатываемого в данный момент, и вызывающего исключение, в список с идентификатором элементов, успешно обновленных. Кроме того, если я обрабатываю 10 элементов и первый элемент в списке создает исключение, мне нужно продолжить работу с другими 9 элементами.

Я думал, что использование @TransactionAttribute (TransactionAttributeType.REQUIRES_NEW) перед постоянными методами решит мою проблему, но это не помогло.

Есть ли способ сделать то, что мне нужно сделать, используя EntityManager, управляемый контейнером?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 марта 2012

Вам не нужно каждый раз создавать новую транзакцию.всякий раз, когда вы хотите откатить транзакцию, вы можете откатить транзакцию на трех уровнях.1005 *

0 голосов
/ 22 марта 2012

Используя @TransactionManagement (TransactionManagementType.BEAN) для определения класса. Я смог самостоятельно управлять транзакцией.

@Stateless

@TransactionManagement(TransactionManagementType.BEAN)
public class MyBean implements MyBeanInterface{
    @PersistenceContext
    private EntityManager em;
    @Resource
    private UserTransaction userTransaction;

    @Override
    public List<String> updateItems(List<Items> items) {
        List<String> itemsId=new ArrayList<String>();
        for(Item item : items){
            try{
                userTransaction.begin();
                doMyStuff(...);
                userTransaction.commit();
                itemsId.add(item.getId());
            }catch(Exception e){
                try {
                    userTransaction.rollback();
                } catch (IllegalStateException e1) {
                    e1.printStackTrace();
                } catch (SecurityException e1) {
                    e1.printStackTrace();                       
                } catch (SystemException e1) {
                    e1.printStackTrace();
                }
            }
        }
        return itemsId;
    }
}

Это работает, но я хотел бы знать, есть ли более чистый способ сделать это? Я имею в виду без использования явных beginTransaction, commitTransaction и rollbackTransaction. Например, используя аннотации вокруг вызова методов doMyStuff ():

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...