12 votes

Les classes persistantes doivent-elles initialiser les collections de variables d'instance

Dans mes classes Hibernate, les collections d'instances doivent-elles être initialisées ?

public class Basket {
    private List items = new ArrayList();

    ...getters and setters...
}

ou laissé sans majuscule

public class Basket {
    private List items;

    ...getters and setters...
}

Est-ce que cela fait une différence pour Hibernate ? Je suis tombé sur ceci Documentation sur Hibernate où il initialise leur HashSet, mais j'ai souvent vu qu'ils n'étaient pas initialisés.

8voto

Mike Partridge Points 1438

En effectuant une initialisation statique comme dans votre premier bloc de code, vous réduisez la nécessité de vérifier les nullités, et si vous savez que vous utiliserez la collection dans la majorité des cas d'utilisation, cela a du sens.

Si, par contre, la collection est rarement utilisée, il est plus logique de reporter l'initialisation jusqu'à ce que vous ayez réellement besoin de l'utiliser.

6voto

Dan Cruz Points 7016

À partir de la page d'accueil d'Hibernate persistent collection documentation :

En raison du modèle relationnel sous-jacent, les propriétés évaluées par collection ne prennent pas en charge la sémantique des valeurs nulles. Hibernate ne fait pas de distinction entre une référence de collection nulle et une collection vide.

Et...

Lorsque vous rendez l'instance persistante, en appelant persist(), Hibernate remplace en fait le HashSet par une instance de l'implémentation de Set propre à Hibernate.

Ces sémantiques de "collection non nulle" et de "persistant" versus "non persistant" sont parfois perdues pour les développeurs. Pour garder les choses simples avec les objets Hibernate, je préfère :

  • toujours initialiser tous les Collections con java.util mises en œuvre
  • toujours le code pour Collection interfaces

Rendre habituel l'objet Hibernate Collection n'étant jamais NULL, ce qui permet d'éviter l'écueil mentionné dans la documentation ci-dessus, à savoir le transfert d'un objet Hibernate Collection à une implémentation invalide.

0voto

Viruzzo Points 2472

Vous devriez l'initialiser. Même si Hibernate devait l'initialiser plus tard même si elle n'avait pas de contenu (ce qui n'est pas toujours le cas), vous devriez l'initialiser pour être sûr qu'elle est toujours cohérente et non nulle.

Dans l'exemple fourni, vous pouvez voir que Cat n'a pas de constructeur explicite sans argument, donc ils ont pour initialiser l'ensemble lors de la déclaration. Le plus souvent, lorsque vous le voyez non initialisé, il y a également un constructeur sans argument explicite qui l'initialise plus tard.

0voto

ŁukaszBachman Points 10541

Je ne peux pas l'étayer par une quelconque documentation professionnelle, mais voici mon opinion à ce sujet. Je pense que vous avez deux voies possibles à suivre.

DTOs seulement

Le site premier s'appuie sur les Model beans pour être des DTOs simples, utilisés uniquement pour la persistance des données, sans aucune logique. Ici, vous pouvez laissez vos champs POJO non initialisés puisque cela sera fait automatiquement par Hibernate avant que vous ne récupériez l'objet persistant via Session. Je suis sûr que vous savez déjà qu'Hibernate va envelopper silencieusement toutes les collections dans ses propres wrappers, ce qui est nécessaire pour le mécanisme de persistance interne.

Classes de modèles appropriées

La deuxième approche va un peu plus loin avec les POJO. Dans ce scénario, vous pouvez exécuter une certaine logique dans les méthodes getters et setters. Ce scénario n'est pas si rare, après tout il est parfaitement acceptable par MVC et très souvent on se trouve dans la nécessité d'ajouter du code à ces méthodes. Par exemple - enregistrer certaines informations en appelant la méthode setter, exemple ci-dessous :

public void setItems(List<Object> items){
   LOGGER.info("Setting '{}' new items", items.size());
   this.items = items;
}

Dans ce cas, on pourrait avoir des problèmes, car pour autant que je sache, la collection ne sera pas initialisée par Hibernate à ce stade. Dans ce cas, une initialisation explicite serait préférable.

Dernière remarque : Je ne suis pas l'expert d'Hibernate, je ne sais pas non plus si quelque chose a changé dans la version 4.x, mais je sais que j'ai enduré ce problème à un moment donné.

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