Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate.Transaction not active. / 2 сообщений из 2, страница 1 из 1
06.08.2015, 18:14
    #39024588
lemur489
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate.Transaction not active.
Добрый день.

На продакшн сервере ИНОГДА возникает проблема - объект не сохраняется(хибернейт не посылает никаких запросов, не выводит никаких ошибок). Никакой закономерности не наблюдается.
есть подозрения, что это связано с (dynamicUpdate = true). Мб оно не всегда считает, что объект был изменен и поэтому не посылает запрос.(Убрать к сожалению эту строчк не могу, потому что упадет производительность)
Сохраняю просто - session.saveOrUpdate.

(если вдруг знаете как решить проблему на данном этапе, дальше можно не читать :) )

Воспроизвести на локальном сервере не получается(доступа к продакшену не имею :( )

Решил сохранять при помощи транзакции.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Session session = getSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            session.saveOrUpdate(contrat);
            tx.commit();
        } catch (Exception e) {
            if (tx != null) tx.rollback();
            throw e;
        } finally {

        }



Сохраняет, но после сохранения вылетает
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
java.lang.IllegalStateException: Transaction not active
	at org.hibernate.ejb.TransactionImpl.getRollbackOnly(TransactionImpl.java:132)
	at org.springframework.orm.jpa.JpaTransactionManager$JpaTransactionObject.isRollbackOnly(JpaTransactionManager.java:612)
	at org.springframework.transaction.support.DefaultTransactionStatus.isGlobalRollbackOnly(DefaultTransactionStatus.java:157)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:742)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at com.sun.proxy.$Proxy268.getStay(Unknown Source)...
	



В базу изменения успешно записываются.
Но нормальный ответ клиенту вернуть не могу. (Данный метод вызывается из вебсервиса и gwt приложения).


ниже привожу мои настройки
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    <persistence-unit name="persistenceUnit">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />
            <property name="hibernate.connection.charSet" value="UTF-8" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="false" />
            <property name="hibernate.generate_statistics" value="false" />
            <property name="hibernate.default_schema" value="public" />
            <property name="hibernate.cache.use_second_level_cache" value="true" />
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
            <property name="hibernate.cache.use_query_cache" value="true" />
            <property name="current_session_context_class" value="thread"/>
            </properties>
    </persistence-unit>

 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
<bean  id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="persistenceUnitName" value="persistenceUnit" />
    </bean>
...
Рейтинг: 0 / 0
07.08.2015, 10:32
    #39024812
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate.Transaction not active.
lemur489,
смотря как реализован метод getSession().
Если это текущая, а не новая сессия (SessionFactory.getCurrentSession() вместо SessionFactory.openSession()), и транзакция в ней уже стартовала, то метод session.beginTransaction() вернет текущую транзакцию. Далее в приведенном коде транзакция завершается, но менеджер про это не знает, и когда пытается её завершить, возникает ошибка "Transaction not active".
Так что единственный надежный метод в данном случае - открывать новую сессию при каждом сохранении, а это замедлит работу.
Или разбираться почему сессия иногда не закрывается после обработки пользовательского запроса (на это указывает поведение, описанное в начале сообщения). Например, сессия сохраняется где-то в приложении / пользовательской сессии.
В качестве временного решения можно порекомендовать использовать session.flush() вместо приведенного кода. Хочется транзакций - использовать соответствующие аннотации. Возможно, использовать вложенные транзакции, если позволяет SQL сервер
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate.Transaction not active. / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]