Set or not set une relation d’un EJB Entity 2 dans ejbCreate() ?

Avec les EJB 2, il est possible de définir des relations entre les entités (de type many-to-one, one-to-many).

Le problème se pose lorsque que l’on veut créer un enregistrement en relation avec l’enregistrement principal que l’on va persister (cas d’une insertion en base).
Par exemple si l’on persiste une instance de l’objet Client, et que celui-ci possède une relation (0-n) vers une table Adresse, on va tout d’abord créer l’instance de Client (avec ejbCreate() en EJB 2), puis l’instance de Adresse également via un ejbCreate(), le tout dans une même transaction.

La question est : où placer le rattachement de Adresse à Client ?
Si l’on essaie dans la méthode ejbCreate() de Adresse d’appeler setClient(monClient) (correspond à une relation FK en BDD), cela ne fonctionnera pas.
On aura une exception du type :

java.lang.IllegalStateException: A CMR field cannot be set in ejbCreate; this should be done in the ejbPostCreate method instead [EJB 2.0 Spec. 10.5.2].

Donc la solution est de définir une méthode ejbPostCreate() avec les mêmes paramètres que la méthode ejbCreate() dans le bean Adresse, et d’y ajouter l’instruction :

setClient(monClient)

Et là çà fonctionne en principe.

BONUS : Et pour voir la spec EJB 2.0 en détail, notamment concernant les EJB Entity : Retour vers les EJB 2.0.

Publicités