2

J'enregistre un historique de toutes les modifications apportées à certaines entités et suis sur le point de mettre en œuvre un mécanisme similaire à Envers pour prendre soin de cela automatiquement. Ma question est de savoir si utiliser Hibernate interceptors or their event system?Intercepteurs Hibernate ou événements pour piste d'audit?

Il me semble que les intercepteurs sont un peu plus simples et font tout ce dont j'ai besoin. Et la propre documentation d'Hibernate suggère d'utiliser des intercepteurs pour "suivre les informations d'audit". Mais leurs informations d'audit ne sont pas dans une table d'accompagnement pour chaque entité et Envers utilise le système d'événements que j'imagine pour une raison. J'utilise Spring 3.0 et Hibernate 3.5 (dernières écuries).

MISE À JOUR: déclencheurs de base de données ne sont pas souhaitables pour cette situation. Je suis impatient d'entendre des réflexions sur les intercepteurs d'hibernation par rapport aux événements pour les pistes de vérification/les historiques de changement.

+0

déclencheurs de base de données serait mon approche préférée à ce sujet. Plus simple que d'utiliser les intercepteurs d'Hibernate. – skaffman

+0

DB déclencheurs ne sont pas si facile avec mon application. J'ai besoin d'enregistrer des informations supplémentaires dans chaque entrée d'audit, y compris la modification qui a été rétablie, la modification sur laquelle chaque changement était basé, etc. et un mécanisme en cascade qui gère cela pour les collections. –

+1

@skaffman: les triggers déplacent la logique dans la couche de base de données. L'utilisation d'un ORM, entre autres, nous aide à garder la logique là où elle appartient, dans la couche application. – cherouvim

Répondre

2

Je pense que la différence essentielle entre les deux est que vous ne pouvez définir qu'un Interceptor dans votre SessionFactory, mais vous pouvez enregistrer de nombreux écouteurs pour un événement particulier.

Je vais utiliser des Intercepteurs car je ne veux que quelque chose de très simple: un horodatage lorsque mon entité est créée (l'annotation @Version s'occupe de la mise à jour de la propriété lastModified).

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
      <prop key="hibernate.hbm2ddl.auto">create</prop> 
     </props> 
    </property> 
    <property name="packagesToScan" value="com.x.domain" /> 
    <property name="entityInterceptor" ref="onSaveInterceptor" /> 
</bean> 

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/events.html#objectstate-interceptors

Questions connexes