Hibernate: предотвращение обновления грязных экземпляров, которые никогда не обновлялись () вручную в сеансе - PullRequest
0 голосов
/ 24 июня 2011

Я сталкиваюсь с поведением Hibernate, о котором я не знаю, является ли это особенностью, или ошибкой / неправильным использованием hibernate в моем коде.

FlushMode моей сессии установлен на FlushMode.AUTO. Если я выполняю запрос на выборку, автоматически запускается процедура автозапуска гибернации и пытается обновить сущность, потому что считает, что она грязная. Однако я не вызываю update () для этой сущности где-то в моем сеансе, и я даже думаю, что не изменяю ее, даже из-за каскадирования. В результате грязный объект, который автоматически обновляется, приводит к тому, что моя база данных находится в нежелательном состоянии. Я отслеживаю это нежелательное обновление объекта с помощью прослушивателя сущности SaveUpdate.

Я собираю всю эту информацию из стековой трассировки (я показываю вам выдержку, моя приведенная выше теория может быть неправильной;))

2011-06-24 09:51:07,790 28671957 (SaveUpdateEventListener.java:140) FATAL  - Stacktrace from last unwanted update
java.lang.Exception
    at a.b.dao.listener.SaveUpdateEventListener.checkEntity(SaveUpdateEventListener.java:138)
    at a.b.dao.listener.SaveUpdateEventListener.onSaveOrUpdate(SaveUpdateEventListener.java:38)
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527)
    at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:241)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:292)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:240)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:193)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:154)
    at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)
    at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
    at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:58)
    at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:997)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1142)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:921)
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:1)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912)
    >> at a.b.dao.pricing.PricingDao.list(PricingDao.java:36) << THE SELECT STATEMENT
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:688)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621)
    ...

Итак, является ли функция автоматического обновления грязных полей функцией? Если да, вызвано ли это FlushMode.AUTO и смогу ли я отключить эту функцию с помощью FlushMode.MANUAL?

1 Ответ

4 голосов
/ 24 июня 2011

Вы должны делать что-то с этими объектами, чтобы Hibernate воспринимал их как грязные. Вместо того, чтобы нарушать нормальное поведение Hibernate, попробуйте найти ошибку / неправильное использование Hibernate в вашем коде.

В качестве альтернативы, если вам абсолютно не нужен интеллект сеанса Hibernate для обнаружения грязных объектов и выдачи вставок, обновлений и удалений на основе этого, рассмотрите возможность использования сеанса без состояния Hibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...