Spring / Hibernate Truncate / Удалить все строки из таблицы - Проблемы с транзакциями - PullRequest
0 голосов
/ 15 октября 2011

У меня есть проект Camel, и после того, как мы создадим управляющий компонент, мы хотим очистить таблицу журнала БД. Поэтому каждый раз, когда мы запускаем приложение, мы ОБРАЩАЕМ таблицу, называемую агентскими заказами. Это настраивается в объекте Enity как именованный запрос.

@NamedNativeQuery(name="cleanOrderTable", query="TRUNCATE agent_orders",resultClass= AgentOrderEntity.class)

Код, который вызывает этот запрос, выглядит следующим образом:

@Component("mgr")
public class Controller{ 

    @PersistenceContext(unitName="camel")
    private EntityManager em;
    .......
    @Transactional
    public void clearHistoricalOrders() throws Exception{
        Query query = em.createNamedQuery("cleanOrderTable");
        query.executeUpdate();
    }
}

При вызове метода очистки истории мы получаем ошибку javax.persistence.TransactionRequiredException: Executing an update/delete query

Я все перепробовал, UserTransaction, em.getTransaction().begin - ничего не работает. Любая идея, как я могу выполнить этот запрос?

В нашем приложении context.xml есть следующая настройка tran manager:

<tx:annotation-driven transaction-manager="txManager" />

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"
        p:dataSource-ref="dataSource">
        <property name="entityManagerFactory" ref="emFactory" />
</bean>

Ответы [ 2 ]

1 голос
/ 15 октября 2011
  • Попробуйте отладить и проверьте, прокси-контроллер у вас и есть ли код, связанный с транзакциями, выполняемый перед вашим методом. Попробуйте включить журналы сервера базы данных, чтобы проверить, какие запросы действительно выполняются.
  • Убедитесь, что у вас нет никаких ServletFilters, которые настраивают транзакцию только для чтения, прежде чем попасть на ваш контроллер.
  • Убедитесь, что ваш менеджер сущностей передан менеджеру транзакций.
  • Кроме того, я обнаружил, что в сервлетах не рекомендуется использовать @PersistenceContext: http://weblogs.java.net/blog/ss141213/archive/2005/12/dont_use_persis.html

Надеюсь, это поможет!

1 голос
/ 15 октября 2011

Я бы попробовал выполнить запрос с TransactionTemplate, просто чтобы убедиться, что аннотация @Transactional действительно не дает эффекта.

Кроме того, что случилось с resultClass= AgentOrderEntity.class? Почему запрос, который усекает таблицу, должен что-то возвращать?

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