Как я могу прервать транзакцию весной с JPA? - PullRequest
1 голос
/ 20 мая 2009

У меня есть этот код:

run big query: Select all unprocessed objects from table A
for each result
    create or update an output object in table B
    update input object: Set it to "processed"

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

Я использую Spring 2.5, Hibernate 3.4 и JPA (т.е. у меня есть EntityManager).

Как мне это сделать? Я пытался вызвать em.getTransaction().commit() в цикле, но Spring не допустит этого.

Ответы [ 4 ]

2 голосов
/ 20 мая 2009

Я бы порекомендовал взглянуть на весенний TransactionTemplate. Документация TransactionTemplate содержит примеры, которые точно описывают то, что вы пытаетесь достичь.

1 голос
/ 20 мая 2009

Операции чтения менеджера сущностей не требуют транзакции. Так что я бы попытался рефакторинг внутреннего метода, чтобы обновить строку и установить его в транзакционный. Обратите внимание, что для использования @ транзакции необходимо использовать публичный метод.

0 голосов
/ 20 мая 2009

Не просматривая весенние документы и не зная настройки транзакции:

Сначала вы должны настроить диспетчер транзакций (возможно, HibernateTransactionManager). Тогда IMHO лучше использовать Spring TransactionTemplate для запуска каждой итерации внутри своей собственной транзакции. Вы должны убедиться, что либо TransactionTemplate действительно запускает новую транзакцию, либо транзакция при входе в метод не выполняется.

Один совет: используйте имя класса диспетчера транзакций в качестве категории журнала для отладки поведения транзакции.

0 голосов
/ 20 мая 2009

Вы должны работать с объектом Hibernate's Session.

Наличие экземпляра javax.persistence.EntityManager (я полагаю, «em»):

((org.hibernate.Session) em.getDelegate()).beginTransaction();

Подробнее: https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html

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