Bonjour
L'idée de ce post est de présenter une des solutions que nous mettons en oeuvre, à mon boulot, afin de résoudre le problème des entités hibernate détachées.
L'idée en est toute simple : lorsque nous travaillons avec des entités, nous voulons qu'elles soient attachées afin d'éviter les soucis.
Pour réaliser ceci, la mise en oeuvre est toute simple : nous avons créé un IModel spécifique, nommé EntityModel<E extends BaseEntity>. Ce dernier s'occupe de s'assurer que l'entité qu'il contient est bien attachée lors de son premier accès au cours de la RequestCycle courant (ou lorsque que créé ou affecté une entité via set(E e)). Lors du détachement, la seule donnée persistée est l'identifiant de l'entité contenue ainsi que sa classe. D'où d'ailleurs l'interface BaseEntity, qui définit (notamment) l'identifiant de chaque entité et une méthode public boolean isPersistent().
En fait, nous poussons l'EntityModel un peu plus loin : utilisant une approche "Open Session In View", nous nous assurons en fait que l'entité est attachée à l'Entity Manager affecté à la session courante.
Au delà, et pour finir sur ce topo, l'EntityModel est à même également de gérer des entités non attachées. Ansi, lorsqu'une entité non persistantes lui est communiqué, il la stocke dans un champ ad hoc qui sera ensuite sérialisé entre les RequestCycle.
A noter que ce modèle n'implique pas que nous travaillons toujours en mode attaché. Il est parfois nécessaire de fonctionner via des value object, lors de wizards ou dialogues par exemple. Simplement, lorsqu'il est possible de travailler avec des entités attachées, l'EntityModel nous évite bien des problèmes et questionnements!
J'espère que cela peut apporter des éléments de réponse, à votre dispo si besoin
++
joseph
nb : je travaille en anglais, du coup parler de tout cela en français ne m'arrive pas trop souvent, veuillez m'excuser d'éventuels anglicismes...
Partager