2010-04-14 32 views
2

Dans notre application, nous extrayons des données à partir d'une base de données mainframe DB2. Si la base de données a des "valeurs faibles" dans un champ, Hibernate envoie une valeur "nulle" dans l'objet. Cela se produit même si la colonne est définie comme "non null".Can Hibernate par défaut une chaîne nulle à la chaîne vide

Comme nous faisons l'analyse XML à ce sujet, Castor rencontre des problèmes. Je voudrais résoudre ce problème dans Hibernate. De plus, tous les fichiers hibernate hbm sont générés, donc nous ne pouvons pas jouer avec eux (ils sont régénérés de temps en temps.)

Un moyen d'intercepter toutes les chaînes et de remplacer les valeurs nulles par ""?

Voici la solution que nous avons trouvée. En fait, il s'agit d'une majuscule et est tronquée (beaucoup de méthodes abstraites sont supprimées).

public class UpperCaseUserType implements org.hibernate.usertype.UserType{ 
    private static final int[] TYPES = {Types.VARCHAR}; 

    public Object nullSafeGet(ResultSet resultSet, String[] strings, Object object) throws HibernateException, SQLException { 
     //This might be redundant to uppercase the getter... 
     return StringUtils.upperCase((String) Hibernate.STRING.nullSafeGet(resultSet, strings[0])); 
    } 
    public void nullSafeSet(PreparedStatement preparedStatement, Object object, int i) throws HibernateException, SQLException { 
     String string = StringUtils.upperCase((String) object); 
     Hibernate.STRING.nullSafeSet(preparedStatement, string, i); 
    } 
} 

Et puis vous le branchez cette façon:

<property name="partNumber" type="cat.dds.fpsdma.model.UpperCaseUserType"> 
     <column name="PART_NUMBER" length="20" not-null="true" /> 
</property> 

Répondre

2
  • Créer un type d'utilisateur personnalisé pour remplacer null avec ""
  • Mettez le nom du type d'utilisateur où vous mettez normalement un nom de type de mise en veille prolongée dans reveng.xml .
+0

C'était notre première pensée et celle que nous implémenterons probablement jusqu'à présent. J'espérais un changement de dialecte ou de configuration, mais cela pourrait être le meilleur que nous puissions obtenir. Merci! – markthegrea

+0

@sliver Je ne suis pas au courant de quelque chose comme ça au niveau du dialecte (ce réglage semble trop spécifique pour être dans le dialecte) mais je peux me tromper. Mon sentiment est qu'un UserType est le moyen de mettre en œuvre cela. –