Чтобы обойти ошибку Hibernate HHH-2763, я пытаюсь обновить свое приложение с Hibernate 3 до Hibernate 4. Казалось, он прошел гладко, пока я не понял, что, хотя мое приложение может читать данные, никогда не кажется, что они вставляют или обновляют. Я включил ведение журнала SQL: в Hibernate 3 есть вставки и обновления. В Hibernate 4 нет вставок и обновлений.Hibernate 4 + Spring 3, No Inserts или Updates
Мы не делали явных флеши в Hibernate 3, перекрывая класс OpenSessionInViewFilter closeSession
метод следующим образом:
public void closeSession(Session session, SessionFactory sessionFactory) {
session.flush();
super.closeSession(session, sessionFactory);
}
Но в Hibernate 4, это уже не вариант, потому что этот метод больше не существует.
Мои Hibernate конфигурации 4 для Factory Session и менеджер транзакций следующим образом:
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.default_schema">${oracle.default_schema}</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.generate_statistics">false</prop>
<prop key="hibernate.show_sql">${hibernate.showSql}</prop>
<prop key="hibernate.use_sql_comments">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list> . . . </list>
</property>
<property name="annotatedClasses">
<list> . . . </list>
</property>
</bean>
<!-- Configure transaction management, enabling @Transactional annotations -->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
<property name="nestedTransactionAllowed" value="true" />
</bean>
(Edit) А вот конфигурация OpenSessionInViewFilter
:
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
Я думаю, что это не так промывание и фиксация. Но почему?
Wt о вашем интерфейсе транзакций? Вы должны изменить свойство update в своей аннотации @ transactional. –
Для улучшения или, что хуже, мы явно указываем 'readOnly = true' или' readOnly = false' с каждой аннотацией '@ Transactional'. Это то, что вы имели ввиду? – Marvo