Wicket Spring Hibernate Транзакционный

У меня следующая проблема. В моем приложении калитки я хочу использовать аннотации @Transactional. Все мои DAO загружаются с аннотациями @Component;

@Component
@Transactional(propagation = Propagation.SUPPORTS)
public class AccountHibernateDataAccessHelper implements
    AccountDataAccessHelper
{
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void saveOrUpdate(T dataObject)
{
    try
    {
        Session session = getSessionProvider().getSession();
        session.saveOrUpdate(dataObject);
    }
    catch (HibernateException e)
    {
        String message = "Failed to batch save or update " + dataObject;
        log.error(message, e);
    }
}
@SuppressWarnings("unchecked")
public <R extends T> List<R> list(Class<R> class1)
{
    Asserts.assertNotNull("class1", class1);
    try
    {
        return createCriteria(class1).setCacheable(true)
                .setCacheRegion(getQueryCacheRegion()).list();
    } catch (HibernateException e)
    {
        String message = "Failed to get a list of" + class1;
        log.error(message, e);
        throw new DataAccessException(message, e);
    } catch (RuntimeException e)
    {
        log.error(e.toString(), e);
        throw new DataAccessException(e);
    }
}

}

My AccountDataAccesshelper реализует следующий интерфейс

public interface DataAccessHelper<T>
{
public Serializable save(T dataObject);

public void saveOrUpdate(T dataObject);

public void update(T dataObject);

public void delete(T dataObject);

public void evict(T dataObject);

}

Далее мои настройки applicationcontext.xml.

<context:component-scan base-package="nl.response.webapp" />
<context:annotation-config />

    <!-- hibernate session factory -->
<bean id="sessionFactory" class="nl.response.responseframework.app.ResponseAnnotationSessionFactoryBean">
    <property name="dataSource" ref="mainDataSource" />
    <property name="hibernateProperties">
        <map>
            <entry key="hibernate.session_factory_name" value="wtxwebapp" />
            <entry key="hibernate.transaction.factory_class" value="org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory" />
            <entry key="hibernate.cache.query_cache_factory"
                value="nl.response.responseframework.service.InvalidatableQueryCacheFactory" />
            <entry key="hibernate.cache.region.factory_class"
                value="nl.response.wtxwebapp.core.hibernate.WtxWebAppEhCacheRegionFactory" />
            <entry key="hibernate.cache.region_prefix" value="hibernate-" />
            <entry key="hibernate.generate_statistics" value="false" />
            <entry key="hibernate.current_session_context_class" value="thread" />
            <entry key="hibernate.cache.use_structured_entries" value="true" />
            <entry key="hibernate.cache.use_query_cache" value="true" />
            <entry key="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
        </map>
    </property>
</bean>

   <bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
        <property name="driverClass" ref="hibernate.connection.driver_class" />
        <property name="jdbcUrl" ref="hibernate.connection.url" />
        <property name="username" ref="hibernate.connection.username" />
        <property name="password" ref="hibernate.connection.password" />
        <property name="poolName" ref="hibernate.connection.username"/>
        <property name="idleConnectionTestPeriodInMinutes" value="60" />
        <property name="idleMaxAgeInMinutes" value="240" />
        <property name="maxConnectionsPerPartition" value="50" />
        <property name="minConnectionsPerPartition" value="5" />
        <property name="partitionCount" value="2" />
        <property name="poolAvailabilityThreshold" value="10" />
        <property name="acquireIncrement" value="4" />
        <property name="statementsCacheSize" value="50" />
        <property name="releaseHelperThreads" value="3" />
        <property name="serviceOrder" value="LIFO" />
    </bean>

<bean id="txManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="dataSource" ref="mainDataSource" />
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="txManager"/>

Поставщик сеанса предоставляет сеанс следующим образом

public Session getSession()
{
    getSessionFactory().openSession();
}

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

Когда я использую getSessionFactory.getCurrentSession(), я получаю следующую ошибку

createCriteria недействителен без активной транзакции

Что мне не хватает? я пытаюсь заставить это работать уже несколько дней, у меня нет вариантов: S


person Niels Van Haren    schedule 08.02.2012    source источник
comment
Я получаю сообщение об ошибке «createCriteria недействительно без активной транзакции» при загрузке списка сущностей.   -  person Niels Van Haren    schedule 08.02.2012


Ответы (1)


Вы открываете новый Session каждый раз, когда звоните getSession().

Попробуйте это вместо этого:

public Session getSession() {
    SessionFactoryUtils.getSession(getSessionFactory(), true);
}

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

Обратите внимание, что если вы не используете OpenInViewSessionFilter или что-то подобное, вы все равно будете создавать новый сеанс для каждого запроса, если только вы не находитесь внутри транзакции. Но на этот раз Spring автоматически закроет их для вас.

person tetsuo    schedule 08.02.2012
comment
+1 это решило мою проблему с моими модульными тестами DAO, которые не могли выселить () только что сохраненный объект - person Brad; 08.08.2012