We apologize for untranslated text, you can use the Google Translation button to get an automatic translation of the web page in the language of your choice.

Comment faire évoluer une classe DBData avec un champ de type primitif ?

Technique

Hibernate supporte assez bien l'évolution de schéma (ajout / retrait de champs) sauf pour les types primitifs. Ceci est dû au fait que les enregistrements de la table précédant cet ajout auront la valeur "NULL" pour ce champ. La conversion en type primitif (int, double, boolean, ...) se passera mal. Hibernate lévera l’exception suivante : org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of …

Si vous devez faire évoluer un type stocké en base pour lui ajouter un nouveau champ primitif, vous devez traiter vous-même la prise en compte de ce champ pour les anciens enregistrements.

Pour cela, il existe principalement 2 solutions

1. Mise à jour manuelle de la table

C’est la solution la plus simple. Il suffit de faire une requête SQL pour affecter les anciennes valeurs de la table.

Par exemple pour l'ajout d'un champ order sur la table G_MYTYPE :

UPDATE G_MYTYPE SET J_ORDER = 0 WHERE (J_ORDER IS NULL)

Attention ! pour les colonnes de type booléen la représentation des valeurs varie selon les bases :

  • PostgreSQL / MySQL / Oracle
    • true / false
  • Derby
    • 1 / 0

2. Mise à jour automatique

Le principe consiste à traiter les null liés aux anciens enregistrements. Pour cela, il faut faire évoluer la classe du type en remplaçant le setter avec un type primitif par un setter avec le wrapper du type primitif.

Exemple :

public void setOrder(Integer v) {
  order = v == null ? 0 : v.intValue();
}

Vous pourrez retrouver ici les dernières nouvelles et les retours d'expérience de l'équipe technique Jalios :

  • Points techniques
  • Retours d'expérience
  • Bonnes pratiques
  • Sécurité
  • Méthodologie Etc.

Ainsi que les principales actualités Jalios.