Comment utiliser le Printemps géré Hibernate intercepteurs au Printemps de Démarrage?
Est-il possible d'intégrer Printemps géré Hibernate intercepteurs (http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch14.html) au Printemps de Démarrage?
Je suis à l'aide de Spring Data JPA et le Printemps de Données de REPOS et la nécessité d'une veille prolongée de l'intercepteur à agir sur une mise à jour d'un champ sur une entité.
Avec la norme JPA événements, il n'est pas possible d'obtenir les valeurs anciennes, et donc je pense que j'ai besoin d'utiliser la veille prolongée de l'intercepteur.
- il y a une façon de le faire à l'aide de SpringAOP stackoverflow.com/a/46041239/2884309
Vous devez vous connecter pour publier un commentaire.
Il n'est pas particulièrement facile d'ajouter de Hibernate intercepteur qui est aussi un Ressort Bean, mais vous pouvez facilement ajouter un intercepteur si c'est géré entièrement par Hibernate. Pour faire ajouter les éléments suivants à votre
application.properties
:Si vous avez besoin de l'Intercepteur à être également un haricot que vous pouvez créer votre propre
LocalContainerEntityManagerFactoryBean
. LeEntityManagerFactoryBuilder
de Printemps de Démarrage 1.1.4 est un peu trop restrictive par le générique de l'propriétés de sorte que vous besoin de lancer pour(Map)
, nous allons nous intéresser à la fixation de 1,2.EntityListener
?Prendre plusieurs threads comme référence j'ai fini avec la solution suivante:
Je suis à l'aide de Spring-Boot 1.2.3.LIBÉRATION (qui est l'actuel ga pour le moment)
Mon cas d'utilisation a été celle décrite dans ce bug (DATAREST-373).
J'avais besoin pour être en mesure d'encoder le mot de passe d'un
User
@Entity
sur créer, et ont une logique spéciale sur enregistrer. Le créer a été très simple à l'aide de@HandleBeforeCreate
et la vérification de la@Entity
id pour0L
l'égalité.Pour la sauver j'ai mis en place un Hibernate Intercepteur qui s'étend d'un EmptyInterceptor
À l'aide de printemps de démarrage de la documentation précise que
Que de nombreuses références, nous pouvons définir notre intercepteur à l'aide de
spring.jpa.properties.hibernate.ejb.interceptor
dans notre Ressort de configuration de Démarrage. Cependant je ne pouvais pas la@Autowire PasswordEncoder
de travail.J'ai donc eu recours à l'utilisation HibernateJpaAutoConfiguration et dominante
protected void customizeVendorProperties(Map<String, Object> vendorProperties)
. Voici ma configuration.Permettra à l'autowiring de la
Interceptor
au lieu de laisser Hibernate pour instancier c'était la clé pour la faire fonctionner.Ce qui me dérange, c'est que la logique est divisé en deux, mais, espérons-le une fois DATAREST-373 est résolu alors ce ne sera pas nécessaire.
Mon simple un exemple de fichier de hibernate auditeurs pour le printemps de démarrage (printemps-amorçage-starter 1.2.4.De presse)
EntityManager.merge()
ne pas déclencher mon onPostUpdate ou onPreUpdate pour une raison quelconque.J'ai eu un problème similaire avec un Printemps 4.1.1, Hibernate 4.3.11 application - pas de Printemps de Démarrage.
Solution que j'ai trouvé (après la lecture de Hibernate EntityManagerFactoryBuilderImpl code) est que si vous passez un haricot de référence au lieu d'un nom de classe à
hibernate.ejb.interceptor
la propriété de l'entité gestionnaire de définition, Hibernate utilisera que déjà instancié bean.Donc, à mon entityManager définition dans le contexte de l'application, j'ai eu quelque chose comme ceci:
La auditInterceptor est géré par le Printemps, par conséquent, permettra à l'autowiring et autres Printemps humeur comportements seront disponibles.
J'ai trouvé une autre approche, après des recherches de deux jours sur la façon d'intégrer Hibernate Intercepteurs avec Spring Data JPA, ma solution est un hybride entre java et de configuration xml de configuration, mais cette post a été très utile. Ma dernière solution a été:
AuditLogInterceptor classe:
Source De Données De Configuration Java:
Entité et les Gestionnaires de Transaction de l'ajout de l'Intercepteur
persistance fichier de configuration
Je suis tombé sur cette même question, et à la liquidation de la création d'un petit ressort de la bibliothèque pour gérer l'ensemble de l'installation.
https://github.com/teastman/spring-data-hibernate-event
Si vous êtes à l'aide de Spring Boot, il suffit d'ajouter la dépendance:
Puis ajouter l'annotation @HibernateEventListener à un mode où le premier paramètre est l'entité que vous souhaitez écouter, et le second paramètre est l'Hibernation de l'événement que vous souhaitez écouter. J'ai aussi ajouté la statique util fonction getPropertyIndex plus facilement accès à la propriété spécifique que vous souhaitez vérifier, mais vous pouvez aussi regarder le raw Hibernate événement.
Bonjour,
Donner à cette lecture: https://github.com/spring-projects/spring-boot/commit/59d5ed58428d8cb6c6d9fb723d0e334fe3e7d9be (utilisation: HibernatePropertiesCustomizer interface)
OU
Pour de simples Intercepteur:
Afin de configurer cela dans votre application, il vous suffit d'ajouter: printemps.jpa.les propriétés.mise en veille prolongée.ejb.intercepteur = chemin d'accès.d'.intercepteur (en application.les propriétés). L'intercepteur doit lui-même être @Composante.
Aussi longtemps que l'intercepteur ne fait pas les utiliser tout de haricots. Sinon, c'est un peu plus compliqué mais je serais plus qu'heureux de vous offrir la solution.
N'oubliez pas d'ajouter dans l'application-test.propriétés, un EmptyInterceptor de ne pas utiliser le système de journalisation (ou ce que vous voulez l'utiliser pour) dans les tests (qui ne serait pas très utile).
Espère que c'était de l'utiliser pour vous.
Comme note finale: toujours mettre à jour votre Spring /Hibernate versions (utiliser le plus tard possible) et vous verrez que la plupart de code deviendront superflus comme les versions plus récentes tentent de réduire les configurations autant que possible.
Parce que l'intercepteur ne pas s'inscrire comme un printemps bean,vous pouvez utiliser un util qui peut obtenir
ApplicationContext
exemple,comme ceci:Ensuite, vous pouvez appeler le service de l'intercepteur,comme ceci: