весенние транзакции в порожденной ветке - PullRequest
1 голос
/ 27 октября 2011

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

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
    at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
    at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687)
    at parity.model.datamapping.RefreshTask.execute(RefreshTask.java:95)
    at com.paritysys.tasks.ASyncTask$1.run(ASyncTask.java:48)
    at java.lang.Thread.run(Thread.java:662)

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

что мне не хватает

мой метод

@TransactionAS400
    @TransactionScores
    public void refresh() {
        ASyncTaskWorker worker = new ASyncTaskWorker() {
            public void progress(double percentage, String message) {
                logger.debug(String.format("%.2f - %s", percentage, message));
            }

            public void handleException(Throwable e) {
                try {
                    status.allowUpdating(property.getSchema());
                } catch (Exception b) {
                    // consume
                }

                logger.error("Failed to complete the refresh task", e);
            }

            public void done(boolean success) {
                status.allowUpdating(property.getSchema());
                logger.debug(String.format(
                        "Reset updating status to default for %s",
                        property.getSchema()));
            }
        };
        RefreshTask refTask = ServiceProviderContext.find(RefreshTask.class);

        refTask.init(property, worker);

        ASyncTaskHandler.getInstance().add(refTask);
        ASyncTaskHandler.getInstance().process();
    }

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

Я столкнулся с подобными ситуациями, когда у меня есть нить вне сферы охвата Spring.Я предлагаю следующее: Определите и подключите экземпляр org.springframework.transaction.support.TransactionTemplate, а затем используйте:

transactionTemplate.execute(new TransactionCallback() {
    @Override
    public Object doInTransaction(TransactionStatus status) {
        //your code
    }
}

Я бы порекомендовал заранее вызвать transactionTemplate.setName("myTransactionsName") для устранения проблем.

0 голосов
/ 27 октября 2011

Хотя шаблон TransactionTemplate, как предлагается в другом ответе, будет работать нормально, есть две другие опции, о которых следует знать:

1) Определите метод как @Transactional (я не уверен, где находятся эти другие аннотациивы используете от) и <tx:annotation-driven> или объявляете DefaultAdvisorAutoProxyCreator bean

2) Определите транзакции с <tx:advice> и pointcuts.

Оба задокументированы в Springруководство .

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