2010-03-16 9 views
2

Je reçois un org.hibernate.ObjectNotFoundException lorsque je veux supprimer un objet qui n'existe plus via Hibernate. Je veux juste que cette exception soit ignorée. Je pourrais attraper l'exception et ignorer, ce serait peut-être une solution. Mais, comme il existe un support d'hibernation pour ignorer cette exception via org.hibernate.cfg.Configuration#entityNotFoundDelegate, je voudrais utiliser son avantage et le contrôler en utilisant la configuration. La question est alors, comment puis-je introduire ma propre/personnalisée mise en œuvre de EntityNotFoundDelegate à la org.hibernate.cfg.Configuration? Est-ce que quelqu'un a un exemple de code pour moi? Juste un conseil supplémentaire, j'utilise Spring Framework aussi bien dans mon projet.Custom EntityNotFoundDelegate

Voici l'exception que je reçois:

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 

Et mes versions:

Mise en veille prolongée: 3.3.1

printemps: 2.5.6

Merci en avance!

Felix

+0

Pour être honnête, je ne suis pas sûr que ce soit l'utilisation prévue. Citant le javadoc * "Spécifie un délégué fourni par l'utilisateur à utiliser pour gérer les scénarios dans lesquels une entité ne peut pas être localisée par l'identifiant spécifié.Ceci est principalement destiné aux implémentations EJB3 pour contrôler comment les erreurs d'initialisation du proxy doivent être gérées ... "*. Pour moi, la vraie question est: pourquoi est-ce que vous supprimez une entité non existante? –

+0

Salut Pascal, Oui, le commentaire java-doc indique l'intention en effet. Cet EntityNotFoundDelegate est peut-être une manière différente d'implémenter l'attribut not-found = "exception"/"ignore" dans les éléments de mappage . La raison pour laquelle je veux ignorer une suppression sur un enregistrement DB non existant est que lorsque deux cliens chargent les mêmes données et que l'un les supprime. L'autre client veut supprimer exactement les mêmes données. Cette deuxième suppression doit être ignorée dans notre cas de test. Peut-être que c'est une meilleure idée de le faire explicitement en attrapant l'exception. – Max

+0

* I * gérerait l'exception en effet. –

Répondre

1

Si vous utilisez un Configuration explicite, vous pouvez appeler la méthode setEntityNotFoundDelegate avec une coutume EntityNotFoundDelegate mise en œuvre qui l'emporte sur handleEntityNotFound pour ne rien faire. En utilisant Spring, ceci est implémenté en spécifiant un SessionFactory personnalisé. Par exemple, vous pouvez étendre LocalSessionFactoryBean et remplacer buildSessionFactory pour appeler le sfb.setEntityNotFoundDelegate avant de créer la fabrique de sessions.

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(); 
    } 
}