Коллекции не сохраняются, потому что Spring-Webapp устанавливает Hibernate-Flush-Mode на Manual - PullRequest
1 голос
/ 04 июня 2011

В моем веб-приложении Spring-3.0.5 / Hibernate-3.3.0 коллекции не хранятся.При создании нового перситентного объекта с ассоциированной коллекцией объект сохраняется, но коллекция не сохраняется.В тестовом примере все работает хорошо, так что это не является ошибочной Mapping-Annotation.

Когда я запускаю тестовый пример и веб-приложение с TRACE уровня журнала, тестовый пример выдает что-то вроде (grep для "[fF] lush":

AbstractFlushingEventListener - flushing session
AbstractFlushingEventListener - processing flush-time cascades
AbstractFlushingEventListener - dirty checking collections
AbstractFlushingEventListener - Flushing entities and processing referenced collections
AbstractFlushingEventListener - Processing unreferenced collections
AbstractFlushingEventListener - Scheduling collection removes/(re)creates/updates
AbstractFlushingEventListener - Flushed: 0 insertions, 0 updates, 0 deletions to 4 objects
AbstractFlushingEventListener - Flushed: 2 (re)creations, 0 updates, 0 removals to 3 collections

, но веб-приложение только говорит:

org.hibernate.impl.SessionImpl - setting flush mode to: MANUAL

Когда я беру vor "SessionImpl", я получаю

DEBUG: org.hibernate.impl.SessionImpl - opened session at timestamp: 13071848978
DEBUG: org.springframework.orm.hibernate3.HibernateTransactionManager - Opened new Session [org.hibernate.impl.SessionImpl@acaf083] for Hibernate transaction
DEBUG: org.springframework.orm.hibernate3.HibernateTransactionManager - Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@acaf083]
TRACE: org.hibernate.impl.SessionImpl - setting cache mode to: GET
TRACE: org.hibernate.impl.SessionImpl - setting cache mode to: NORMAL
TRACE: org.hibernate.impl.SessionImpl - setting cache mode to: GET
TRACE: org.hibernate.impl.SessionImpl - setting cache mode to: NORMAL
TRACE: org.hibernate.impl.SessionImpl - after transaction completion
TRACE: org.hibernate.impl.SessionImpl - closing session

для теста и

DEBUG: org.hibernate.impl.SessionImpl - opened session at timestamp: 13071842364
TRACE: org.hibernate.impl.SessionImpl - setting flush mode to: MANUAL
TRACE: org.hibernate.impl.SessionImpl - closing session

для веб-приложения.

Понятия не имею, почему веб-приложение всегда отключает автоматическую очистку!

Вот мое веб-приложение.Конфигурация (сокращение для ясности):

  <tx:annotation-driven proxy-target-class="true"/>
  <context:spring-configured/>
  <context:component-scan base-package="de.halbekunst.fotos" />
  <mvc:annotation-driven />

и мои определения ресурсов:

  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${jdbc.driverClassName}"/>
    <property name="jdbcUrl">
      <value><![CDATA[${jdbc.url}]]></value>
    </property>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="minPoolSize" value="3"/>
    <property name="maxPoolSize" value="30"/>
    <property name="acquireIncrement" value="3"/>
    <property name="maxIdleTime" value="25200"/>
    <property name="maxIdleTimeExcessConnections" value="14400"/>
    <property name="idleConnectionTestPeriod" value="7200"/>
    <property name="maxStatements" value="50"/>
    <property name="preferredTestQuery" value="SELECT 1;"/>
  </bean>

  <!-- Hibernate SessionFactory -->
  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="de.halbekunst.fotos"/>
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=${hibernate.dialect}
        hibernate.query.substitutions=true 'Y', false 'N'
        hibernate.cache.use_second_level_cache=false
        hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
      </value>
      <!-- Turn batching off for better error messages under PostgreSQL -->
      <!-- hibernate.jdbc.batch_size=0 -->
    </property>
  </bean>

  <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
  <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
  </bean>

1 Ответ

2 голосов
/ 13 июня 2011

После одной недели отладки (я сократил свой исходный проект, пока не смог определить источник описанной ошибки) Теперь я знаю, что пошло не так:

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

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

https://github.com/kai-moritz/experiment

Тебе нужен Maven! Чтобы запустить пример, просто выполните две команды

mvn war:inpace
mvn jetty:run
...