Bonjour à tous,
Je vous soumets ici un petit problème que je rencontre actuellement.
Mon problème vient principalement du fait que je monte une application sur une base de données existante. Imaginez donc que j'ai une table contenant des personnes, mais que cette table, au lieu d'avoir un identifiant unique numérique auto incrémenté, possède une clé primaire sur plusieurs champs. Comme exemple, disons le nom, le prénom et l'âge (String, String, Integer).
Au niveau de JPA, tout se passe à merveille avec un objet PersonEntity qui a une clé primaire @Id placé sur un objet PersonEntityPk contenant les trois champs. Ma seconde classe, disons Vehicule, est associé à une et une seule personne. Nous avons donc une bête @ManyToOne placée avec un lot @JoinColumns contenant trois @JoinColumn contenant le nom, prénom et âge.
Au niveau de la couche web, j'ai un managed bean VehiculeBean contenant l'objet Véhicule (en fait un DTO récupéré de la couche applicative, mais ça change peu de choses). Cet objet véhicule possède naturellement un champ Personne représentant la relation @ManyToOne.
Là où j'ai un peu plus de mal, c'est sur le formulaire permettant d'ajouter des véhicules. Le formulaire va contenir entre autre les trois champs formant la clé primaire de la personne à associer. Il ont cette tête (le champ value n'est pas mentionné car je ne sais pas encore comment le placer) :
J'aimerais placer ensuite un Converter permettant de transformer lors de la sousmission de ce formulaire les trois champs en un objet Personne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <h:inputText id="nom" value="#{...}" /> <h:inputText id="prenom" value="#{...}" /> <h:inputText id="age" value="#{...}" />
Mon principal problème est que dans mon Converter, je n'ai accès qu'à l'une des trois valeurs à la fois. C'est d'ailleurs normal, la conversion est réalisée avant la mise à jour des composants de la vue JSF. Quand je suis dans la méthode getAsObject de mon Converter, j'ai l'une des trois valeurs initialisée, celle qui est passée à la fonction. J'ai testé et je ne peux malheureusement pas récupérer la valeur du formulaire avec un code ressemblant à :
La raison est, si j'ai bien saisi le cycle de vie des composants JSF, que la phase "Apply Request Values" effectue la conversion avant de mettre à jour l'arbre de la vue.
Code : Sélectionner tout - Visualiser dans une fenêtre à part UIInput nomComponent = (UIInput)context.getViewRoot().findComponent("contentForm:nom");
J'ai malheureusement besoin des trois valeurs pour trouver mon objet personne.
Notez également que les trois champs n'ont pas de required="true". En effet, la relation est optionnelle. Je ne peux donc pas m'assurer que je vais à tout coup passer dans le Converter pour le troisième champ (auquel cas j'aurais peut être pu rajouter un managed bean pour mettre en session les valeurs des deux premiers champs lors des deux premiers appels au converter, puis lorsque le troisième appel est réalisé récupérer de la session les valeurs des deux premiers champs pour faire l'appel applicatif et trouver la bonne personne dans la base de données).
Je ne vois pas comment m'y prendre pour ce cas, je suppose qu'il doit pourtant y avoir un moyen relativement simple de gérer ça.
Désolé si la lecture est un peu longue, mon problème est pas long à expliquer, par contre ce que j'ai déjà testé l'est un peu plus.
Si je résume : comment arriver à associer un Converter à plusieurs champs pour les convertir en un objet de BD possédant une clé primaire multiple.
Merci d'avance pour vos suggestions !
Partager