6 votes

Hibernate: Changer la mappage de Boolean en 's'/'n'?

Je suis actuellement en train d'essayer de faire fonctionner Hibernate avec une base de données Oracle 8 Legacy. Tout fonctionne bien jusqu'à présent, mais maintenant j'ai rencontré un problème que je dois encore surmonter : Les valeurs booléennes dans la base de données ne sont pas conservées dans le format 'y'/'n' ou 't'/'f' ou 0/1, mais parce que le projet provient d'une zone hispanophone, elles sont enregistrées sous la forme 's'/'n' pour oui/non. Cependant, cela n'est évidemment pas pris en charge par Hibernate.

Des idées ? Je vous serais reconnaissant de chaque petit indice dans la bonne direction. Par exemple, quelle classe effectue le mapping des booléens, afin que je puisse éventuellement le remplacer/créer ma propre version ?

Merci d'avance.

2voto

JB Nizet Points 250258

À ma connaissance, vous devriez utiliser votre propre classe Dialect, étendant la classe Dialect que vous utilisez actuellement, et remplacer la méthode toBooleanValueString().

2voto

dkateros Points 943

Un autre point d'extension que je connais est d'utiliser le contrat

org.hibernate.usertype.UserType

Les méthodes les plus importantes que vous devez implémenter sont nullSafeSet et nullSafeGet. Celles-ci fournissent les crochets nécessaires pour convertir la valeur du ResultSet en l'objet Java avant qu'Hibernate "hydrate" l'objet et vice versa.

Par exemple

public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
        String value = rs.getString(names[0]);
        if(value==null) {
            //gérer cela
        }
        //gérer d'autres possibilités comme Si/Non ou autre ici
        return "s".equals(value) ? Boolean.TRUE : Boolean.FALSE;
    }

    public void nullSafeSet(PreparedStatement st, Object value, int index) 
    throws HibernateException, SQLException {
        if (value==null) {
            //gérer cela
            return;
        }
        Boolean bValue = (Boolean) value;
        if(bValue) {
            st.setString("s", index);
        } else {
            st.setString("n", index);
        }
        //gérer d'autres possibilités comme Si/Non ou autre ici
    }

Ensuite, il suffit de rendre votre implémentation UserType connue de Hibernate, ce que vous pouvez faire dans les mappings Hibernate en tant qu'élément typedef ou simplement en utilisant l'attribut de type des éléments de propriété auxquels le UserType est applicable.

1voto

harrybvp Points 2333

C'est ainsi que je ferais en définissant un Type personnalisé dans Hibernate

public class CustomBooleanType extends BooleanType {

   public static final String TRUE = "s";
   public static final String FALSE = "n";

   public CustomBooleanType () {
      super(CharTypeDescriptor.INSTANCE, new BooleanTypeDescriptor(TRUE.charAt(0), FALSE.charAt(0)));
   }  
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X