Gérer simplement les Blob avec Spring 4 et Hibernate 4

Spring_frameworkhibernate_logo_a

 

 

 

Dans la première partie de cet article nous avons évoqué les CLOB/BLOB avec spring-jdbc. Nous poursuivons l’exploration du même thème mais cette fois avec Spring 4 et Hibernate 4. L’approche est un peu semblable mais pas trop et les difficultés sont pratiquement identiques.

Merci de (re)lire [juste] l’introduction de l’article précédent pour mieux suivre cette seconde partie.

Mapping: Dozer is dead! Long live MapStruct

dozer vs logo-MapStruct

Qui n’a jamais eu de soucis avec Dozer ?

Qui n’a pas eu des LazyInitializationException (LIE) avec le mapping des entités Hibernate ? Sans parler des lenteurs et du trafic généré vers le serveur et la base de donnés suite à une mauvaise conception !

Et sans vouloir trancher le débat sur Dozer ou tout autre framework de mapping vs mapping à la mano : à la main c’est toujours plus rapide!

LazyInitializationException sur un composant selectManyMenu (JSF / PrimeFaces)

L’objectif de cet article est d’éviter la levée d’une LazyInitializationException lors de l’utilisation d’un composant JSF selectManyMenu (ou PrimeFaces).

L’application, sur laquelle je travaille actuellement, repose sur les technologies JSF et JPA (Hibernate). J’ai dû, pour les besoins du projet, créer une page contenant un composant selectManyMenu, qui permet de sélectionner plusieurs éléments d’une liste :

selectManyMenu

Search in the SI : Hibernate Search

Hibernate Search est une surcouche qui facilite l’intégration du moteur d’indexation et de recherche Lucene. Il permet notamment la recherche fulltext dans des données structurées en SGBD (ou dans une base de données NoSQL). Son principe est simple, il propose de s’appuyer sur les entités JPA (déjà mappés sur la base de données) en définissant un mapping Object<->Document (au sens document Lucene). Ensuite Hibernate Search se charge de tout : Maintien des indexes à jour, récupération des entités JPA à partir d’une requête dans le moteur de recherche, … On s’affranchit ainsi de l’écriture de beaucoup de code (voir un tutoriel pour s’en rendre compte). Voyons dans le détail comment mettre en place Hibernate Search dans nos applications.

Améliorez les performances avec Spring-Ehcache: Cache & @Cacheable

Le recours à l’emploi de caches dans nos projets permet d’améliorer significativement les performances.

logo-ehcache.png

Dans ce billet contrairement à celui-ci nous ne codons rien dans la partie métier pour éviter le couplage.

Spring sait rendre les choses simples plus simples et les choses complexes possibles.

Un cache sert à optimiser les accès aux données néanmoins ce n’est la solution miracle à tous les problèmes de performances.

Mais une fois mis en œuvre à bon escient, on se demande comment peut-on s’en passer.

Donc depuis Spring 3.1, implémenter une gestion de cache devient possible sans trop écrire du code.

La démo ci-après, sans aborder les détails d’implémentation de la couche DAO, présente un exemple concret de mise en (EH)cache.

Sachez néanmoins que les illustrations données reposent sur une implémentation basée sur spring-data.

Spring offre une implémentation light de mise en cache qui ne peut satisfaire les besoins de nos projets.

C’est pour cette raison qu’ici nous utilisons Ehcache.

L’annotation @Cacheable de Spring apposée sur les méthodes (finder par exemple) suffit.

L’AOP Spring rend la gestion du cache facile à l’instar des transactions déclaratives.

Jasypt, Bouncy Castle, Hibernate et Spring: Simplifier la cryptographie en java

Jasypt: did you know?
jasypt-small.png

C’est une API java, open source, qui simplifie grandement le chiffrement et l’anonymisation (hachage).
Jasypt : Java Simplified Encryption: le chiffrement simplifié en java.
Plus d’informations sur le site Jasypt.

Ce qui est intéressant c’est la facilité avec laquelle nous pouvons intégrer les frameworks: Hibernate3, Spring3, Bouncy Castle et Jasypt pour réaliser de manière
totalement transparente le cryptage ou l’anonymisation des (ou de certains) champs de la base de données.

Transparente, c’est à dire?

Justement la suite de ce billet démontre que le code métier ne sera pas impacté ni modifié.
Il suffit de configurer Spring et d’annoter (ou l’équivalent en xml) les entités persistantes avec les annotations d’Hibernate.
Q. C’est tout?
R. Oui, Heu… Peut-être également déclarer de nouveaux types pour Hibernate avec de nouvelles annotations.

Signalons que Jasypt suit les normes Oracle JCA / JCE pour la cryptographie uni-directionnelle (digest) ou bi-directionnelle.
Jasypt s’intègre parfaitement à Spring 2 & 3. Il est même conçu pour s’intégrer de façon thread-safe.
Jasypt est ouvert à tout fournisseur (provider) de JCE, par exemple Bouncy Castle.

Jasypt offre la possibilité de crypter les champs persistants avec Hibernate3 & 4.
L’objet de la démo ci-dessous est d’illustrer ce dernier point.
Pour cela, elle utilise Bouncy Castle Provider pour chiffrer les champs persistants avec notre ORM préféré Hibernate.
Enfin, Jasypt fournit une console qui permet de faciliter les phases de tests/recettes en modifiant directement les données dans la base

Passons au concret. L’environnement est BD Informix (ou toute autre), Spring3, Hibernate3, Bouncy Castle, Eclipse STS, Java6, Maven2. (Rien que çela…!)
Noter que notre thème est proche de celui traité dans mon billet sur filtre et cryptage.

Hibernate: Afficher les valeurs des paramètres de ses requêtes

hibernate.gif

Qui n’a pas souhaité voir s’afficher, dans la requête sql/hql (query) d’Hibernate, les valeurs des paramètres au lieu des points d’interrogation ?
Par exemple, qui n’a jamais voulu avoir précisément les valeurs au lieu de (?, ?,?) dans la requête sql ci-après tracée par hibernate dans les logs:

insert into domaine  (description, libelle, id) values (?,  ?, ?)

Ce tips indique la marche à suivre.