Utiliser une ArrayList avec JPA
La spécification JPA requiert uniquement le support de collections définies par leur interface (java.util.Collection, java.util.Set, java.util.List et java.util.Map) au sein d’une entité. La définition d’une collection par le biais de son implémentation (par exemple java.util.ArrayList) n’est donc pas requis :
Collection-valued persistent fields and properties must be defined in terms of one of the following collection-valued interfaces regardless of whether the entity class otherwise adheres to the JavaBeans method conventions noted above and whether field or property access is used: java.util.Collection, java.util.Set, java.util.List [3] , java.util.Map. The collection implementation type may be used by the application to initialize fields or properties before the entity is made persistent. Once the entity becomes managed (or detached), subsequent access must be through the interface type.
page 25 de la spécification JPA
En fonction de l’implémentation utilisée il est néanmoins possible que cela soit supporté.
Voyons ce que les deux principales implémentations de JPA permettent :
- EclipseLink supporte effectivement l’utilisation d’implémentations mais avertit que cela n’est pas optimal :
En effet EclipseLink utilisera sa propre implémentation de la collection afin d’optimiser le chargement de la collection par chargement paresseux.
- Hibernate ne permet pas l’utilisation d’implémentations (le message d’erreur n’est pas très parlant !) :
Attention donc si vous changez d’implémentation JPA (par exemple lors d’une migration du serveur d’applications).
Vous pouvez trouver le code source du projet utilisé pour cet article sur GitHub.