Java / Hibernate - операции записи не разрешены в режиме только для чтения

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

Вот в чем дело - иногда я получаю следующую ошибку при попытке обновить или создать новый объект с помощью спящего режима:

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1186)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:696)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:694)

Что действительно странно, так это то, что иногда при обновлении объекта с помощью метода getHibernateTemplate (). saveOrUpdate (object); он будет работать, но иногда с тем же объектом и при вызове того же метода он не работает, но, похоже, это зависит от того, как я получаю объект в первую очередь.

Пример : допустим, у меня есть таблица с 3 полями: идентификатор, тип, длина. Что может случиться, так это то, что если я получу объект по идентификатору и обновлю длину, он будет работать. Если я получу его по типу и обновлю длину, то это не сработает. Итак, что я делал до сих пор, чтобы избежать проблемы, - это получить объект методом, который не вызовет проблемы позже, но становится все более и более раздражающим пытаться найти способ, который работает.

Кроме того, теперь у меня есть это исключение при попытке создать объект (но не все из них, только в одной конкретной таблице), и я не могу найти способ обходного пути. И я попытался добавить @Transactional (readOnly = false) в транзакцию, но это ничего не изменило, а отображение режима означало, что я все равно не в режиме только для чтения.

Любой предложения?

Редактировать 26 июля: вот некоторая конфигурация, относящаяся к спящему режиму

<property name="hibernateProperties">
    <props>
        <prop key="jdbc.fetch_size">20</prop>
        <prop key="jdbc.batch_size">25</prop>
        <prop key="cglib.use_reflection_optimizer">true</prop>
        <prop key="hibernate.show_sql">true</prop>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="connection.autoReconnect">true</prop>
        <prop key="connection.autoReconnectForPools">true</prop>
        <prop key="connection.is-connection-validation-required">true</prop>
    </props>
</property>

, если это может помочь

<property name="transactionAttributes">
    <props>
        <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
        <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
        <prop key="execute*">PROPAGATION_REQUIRED</prop>
        <prop key="add*">PROPAGATION_REQUIRED</prop>
        <prop key="create*">PROPAGATION_REQUIRED</prop>
        <prop key="update*">PROPAGATION_REQUIRED</prop>
        <prop key="delete*">PROPAGATION_REQUIRED</prop>
    </props>
</property>

Редактировать 31 августа: Соответствующий код в моем классе, расширяющий HibernateDaoSupport для сохранения объектов:

public void createObject(Object persisObj) {
    getHibernateTemplate().save(persisObj);
}
15
задан Guillaume 31 August 2011 в 17:13
поделиться