RSS Feed

Archive de August, 2006

Hibernate Tools – empêcher la génération des relations one-to-many

17 August 2006 par SeB Pas de commentaire »

Introduction

Hibernate Tools est très puissant pour générer le code des Java beans et les fichiers de configuration de mapping utilisés par Hibernate. Cependant, le code généré par défaut n’est pas forcément nécessaire. Par exemple, les relations one-to-many sont souvent inutiles.

Par exemple en considérant les tables USER et USER_ROLE et leur Java beans respectifs User et UserRole. La relation many-to-one représentée par la méthode User.getUserState() est utile. Par contre, la relation one-to-many représentée par la méthode UserRole.getUsers() est complètement inutile[1]. Heureusement, les concepteurs de Hibernate Tools ont pensé à nous et nous proposent deux solutions :

  • via le fichier reveng.xml[2]
  • via le reveng. strategy

Solutions

reveng.xml

Ce fichier permet de configurer le comportement de l’outil de génération du mapping à partir de la base de données table par table. Pour empêcher la génération des relations one-to-many, il faut ajouter des sections de la forme :

<table schema="MYSCHEMA" name="USER_ROLE">
      <foreign-key constraint-name="FK_USER_USER_ROLE">
         <many-to-one property="User" exclude="true" />
      </foreign-key>
</table>

reveng. strategy

Cette méthode consiste à implémenter une classe fille de la classe DelegatingReverseEngineeringStrategy[3]. L’implémentation de la méthode ci-dessous permet de ne pas générer de relation one-to-many avec Hibernate Tools :

public boolean excludeForeignKeyAsCollection(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) {
      return true;
}

Conclusion

La seconde méthode permet d’automatiser le traitement pour l’ensemble des tables dont il est nécessaire de générer le mapping à partir du modèle de la base de données. C’est donc la solution à préférer si l’on souhaite adopter ce comportement par défaut.

Notes

[1] En tout cas pour les utilisations que j’en fait.

[2] Pour le moment, l’éditeur graphique ne permet de configurer cela, il faut le faire à la main.

[3] Cette méthode est très pratique pour automatiser certains comportement qui doivent être commun à toutes les tables, voire toutes les colonnes.

 

JSP 2.0, JSTL 1.1 – impossible d’utiliser les expressions languages dans des taglibs

16 August 2006 par SeB Pas de commentaire »

Vous vous êtes décidé d’écrire les pages JSP 2.0 avec la JSTL 1.1 le tout en XML[1]. Il faut dire au revoir aux scriptlets et bonjour aux EL ! ;-) Mais vous rencontrez peut-être cette erreur :

org.apache.jasper.JasperException: /index.jsp(33,32) According to TLD or attribute directive in tag file, attribute value does not accept any expressions
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:585)
	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
	java.security.AccessController.doPrivileged(Native Method)
	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
	java.security.AccessController.doPrivileged(Native Method)
	java.security.AccessController.doPrivileged(Native Method)
	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
	org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
	org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:239)
	org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelativeForward(TilesRequestProcessor.java:341)
	org.apache.struts.action.RequestProcessor.processForward(RequestProcessor.java:572)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:221)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:585)
	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
	java.security.AccessController.doPrivileged(Native Method)
	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)

Votre page JSP commence sûrement par quelque chose qui ressemble à ceci :

<jsp:root
	xmlns:jsp="http://java.sun.com/JSP/Page"
	xmlns:c="http://java.sun.com/jstl/core"
	xmlns="http://www.w3.org/1999/xhtml"
	version="2.0">

Si c’est le cas, la déclaration ci-dessus correspond à la JSTL 1.0.

Le problème vient du fait que vous utilisez un moteur JSP 2.0 qui traite les EL avant d’appeler les taglibs. Ce moteur n’est pas compatible avec les taglibs qui intègrent la gestion des EL comme le fait la JSTL 1.0. Pour résoudre ce problème, il faut utiliser la JSTL 1.1 qui est faite pour les JSP 2.0.

Pour déclarer l’utilisation des JSTL 1.1, votre page JSP doit commencer ainsi :

<jsp:root
	xmlns:jsp="http://java.sun.com/JSP/Page"
	xmlns:c="http://java.sun.com/jsp/jstl/core"
	xmlns="http://www.w3.org/1999/xhtml"
	version="2.0">

Je profite pour vous rappeler les excellentes présentation d’adiGuba sur :

Vous allez enfin pouvoir écrire des JSP 2.0 tout en utilisant la puissance des EL.

Notes

[1] Appelées également JSPX.

 

Etes-vous du genre Google Addict ?

3 August 2006 par SeB 4 commentaires »

La société Google propose régulièrement de nouveaux services. A tel point, qu’il est difficile de répondre à la question :

Qu’est-ce que c’est Google ?

Le site Depanne Ton PC se propose de répondre à cette question. Après une courte présentation de la société, ils listent les 55 services proposés par Google[1]. Chaque service est détaillé et évalué. Il en ressort un excellent dossier de 31 pages sur le sujet.

Pour mesurer, mon niveau de dépendance avec Google voici la liste des services que j’utilise :

J’avais également utilisé quotidiennement My Google[3] pendant un certain temps avant de le remplacer par Google Reader.

Et vous, à quel point être-vous Google Addict ? Quels services utilisez-vous ? Avec quel niveau de dépendance ?

Notes

[1] Vous m’excuserez de ne pas avoir été vérifier s’il en manquait.

[2] Voilà un service qui n’est pas présent dans la liste !

[3] Encore un autre service oublié…