Пользовательский EntityNotFoundDelegate - PullRequest
2 голосов
/ 16 марта 2010

Я получаю org.hibernate.ObjectNotFoundException, когда хочу удалить объект, который больше не существует, через спящий режим. Я просто хочу, чтобы это исключение было проигнорировано. Я мог бы поймать исключение и игнорировать, возможно, это было бы решением. Но, поскольку существует гибернационная поддержка игнорирования этого исключения через org.hibernate.cfg.Configuration#entityNotFoundDelegate, я хотел бы использовать его преимущество и управлять им с помощью конфигурации. Тогда возникает вопрос, как я могу представить собственную / пользовательскую реализацию EntityNotFoundDelegate в org.hibernate.cfg.Configuration? У кого-нибудь есть пример кода для меня? Просто дополнительный совет, я использую Spring Framework в своем проекте.

Вот исключение, которое я получаю:

Caused by: org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException: No row with the given identifier exists: [de.mycompany.domain.ResultObject#810b1334-32d3-02b0-e044-769e0ab48e48]; nested exception is org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [de.mycompany.domain.ResultObject#810b1334-32d3-02b0-e044-769e0ab48e48]
   at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:660)
   at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
   at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
   at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
   at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:865)
   at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:859)
   at de.mycompany.utils.dao.impl.PersistentDaoImpl.delete(PersistentDaoImpl.java:50)
   at de.mycompany.utils.service.ServiceImpl.delete(ServiceImpl.java:68)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
   at de.mycompany.utils.service.ServiceInterceptor.invoke(ServiceInterceptor.java:43)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
   at $Proxy3.delete(Unknown Source)
   ... 14 more
Caused by: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [de.mycompany.domain.ResultObject#810b1334-32d3-02b0-e044-769e0ab48e48]
   at org.hibernate.impl.SessionFactoryImpl$2.handleEntityNotFound(SessionFactoryImpl.java:409)
   at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:108)
   at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:97)
   at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:140)
   at org.hibernate.engine.StatefulPersistenceContext.unproxyAndReassociate(StatefulPersistenceContext.java:594)
   at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:90)
   at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:74)
   at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:793)
   at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:778)
   at org.springframework.orm.hibernate3.HibernateTemplate$26.doInHibernate(HibernateTemplate.java:871)
   at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
   ... 30 more

И мои версии:

Спящий режим: 3.3.1

Весна: 2,5,6

Заранее спасибо!

Felix

1 Ответ

1 голос
/ 04 августа 2016

Если вы используете явный Configuration, вы можете вызвать метод setEntityNotFoundDelegate с пользовательской реализацией EntityNotFoundDelegate, которая переопределяет handleEntityNotFound, чтобы ничего не делать.

Используя Spring, это реализуется указанием пользовательского SessionFactory. Например, вы можете расширить LocalSessionFactoryBean и переопределить buildSessionFactory для вызова sfb.setEntityNotFoundDelegate перед построением фабрики сеансов.

public class LocalSessionFactoryBeanIgnoringErrors extends LocalSessionFactoryBean {

    @Override
    protected SessionFactory buildSessionFactory(LocalSessionFactoryBuilder sfb) {
        sfb.setEntityNotFoundDelegate(new EntityNotFoundDelegate() {

            @Override
            public void handleEntityNotFound(String entityName, Serializable id) {
                System.out.println("Entity " + entityName + " with id " + id + " not found");
            }
        });
        return sfb.buildSessionFactory();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...