Dans l'entreprise pour laquelle je travaille, nous avons cette discussion majeure sur l'opportunité d'utiliser des classes wrapping pour les primitives (Java.lang.Integer, Java.lang.Long) ou s'il faut utiliser les types primitifs directement dans les POJO qui mappent Entités aux tables dans Hibernate.
L'idée est que nous voulons que ces valeurs ne soient pas nulles dans la base de données.
Les arguments en faveur de l'utilisation de primitives:
Les arguments en faveur de l'utilisation d'objets wrapper:
Utilisez des emballages, simplifiez-vous la vie.
Votre modèle de données devrait le dicter. Vous devez de toute façon appliquer la nullité dans la base de données.
S'ils peuvent être annulés dans la base de données, utilisez des wrappers. S'ils ne sont pas annulables et que vous utilisez des wrappers, vous obtiendrez une exception si vous essayez d'insérer un null dans la base de données.
Si votre modèle de données ne le dicte pas, optez pour une convention, utilisez des wrappers tout le temps. De cette façon, les gens n'ont pas à penser ou à décider qu'une valeur de 0 signifie null.
Je voudrais également interroger votre affirmation selon laquelle ce serait moins performant. L'avez-vous mesuré? Je veux dire vraiment mesuré? Lorsque vous parlez à une base de données, il y a beaucoup plus de considérations que la différence entre 16 bits et 32 bits.
Utilisez simplement la solution simple et cohérente. Utilisez des wrappers partout, à moins que quelqu'un ne vous donne très une bonne raison (avec des statistiques précises) de faire autrement.
J'ai pensé qu'il fallait le mentionner:
La recommandation Hibernate (section 4.1.2) utilisant des propriétés non primitives dans des classes persistantes fait en fait référence - comme intitulé - à propriétés d'identificateur:
4.1.2. Fournir une propriété d'identifiant
Le chat a une propriété appelée id. Cette propriété correspond aux colonnes de clé primaire d'une table de base de données. La propriété peut avoir été appelée n'importe quoi et son type peut être n'importe quel type primitif, n'importe quel type "wrapper" primitif, Java.lang.String ou Java.util.Date.
...
Nous vous recommandons de déclarer des propriétés d'identificateur à nom cohérent sur les classes persistantes et d'utiliser un type nullable (c'est-à-dire non primitif).
Néanmoins, les avantages des primitives ne sont pas forts:
La documentation Hibernate (juste la première version que j'ai trouvée) indique:
La propriété peut avoir été appelée n'importe quoi et son type peut être n'importe quel type primitif, n'importe quel type "wrapper" primitif, Java.lang.String ou Java.util.Date.
...
Nous vous recommandons de déclarer des propriétés d'identificateur à nom cohérent sur les classes persistantes et d'utiliser un type nullable (c'est-à-dire non primitif).
La "voix de l'expert" suggère donc d'utiliser Integer
/Long
... mais ce n'est pas décrit pourquoi c'est le Cas.
Je me demande si c'est pour qu'un objet qui n'a pas encore été persisté puisse être créé sans un identifiant (c'est-à-dire avec une valeur de propriété de null
), le distinguant des entités persistantes.