JSF Primefaces SelectOneMenu
Personne ne peut avoir qu'une seule voiture , mais dans le datatable je veux afficher toutes les voitures dans la liste, mais de sélectionner un utilisateur de la personne appartient. De cette façon, l'utilisateur peut mettre à jour toute personne de la voiture à la volée.
Disons que j'ai deux tables
Person
id
name
car_id
Cars
id
name
Idéalement , person
devrait avoir Cars
id primary
clé, mais ce n'est pas le cas. De sorte que chaque personne a la voiture ,à droite.
Maintenant, je suis de l'affichage de la liste de person
dans datatable par exemple
------------------------------------
Name | Car
----------------------------------------
ABC | 1
DDD | 2
Mais je veux montrer comme :
------------------------------------
Name | Car
----------------------------------------
ABC | Toyota
DDD | Ford
Le code existant :
<p:dataTable value="#{test.persons} var="person">
<p:column headerText="Name">
#{person.name}
</p:column>
<p:column headerText="Name">
#{person.carID}
</p:column>
</p:dataTable>
Mais je veux faire quelque chose comme:
<p:dataTable value="#{test.persons} var="person">
<p:column headerText="Name">
#{person.name}
</p:column>
<p:column headerText="Car">
<p:selectOneMenu value="#{test.selectedCar}"
converter="entityConverter">
<f:selectItems value="#{spMBean.cars}" var="car"
itemLabel="#{car.name}" itemValue="#{car}" />
</p:selectOneMenu>
</p:column>
</p:dataTable>
Si quelqu'un peut m'aider avec cela, je vais l'apprécie beaucoup.
- Êtes-vous en utilisant certains outil ORM comme Hibernate?
Ideally , person should have Cars id as primary key but that is not the case. So each person has car ,right.
Je ne comprends pas cette déclaration, je pense que votre modèle est correct. - Oui , je suis en utilisant JPA Hibernate. En fait, j'ai similaires tables ,même si la Personne a voiture id, mais il n'a pas de clé primaire de la table de Voitures comme foriegn clé. Je sais que la conception de base de données n'est pas droit.
- Le modèle est nier la possibilité qu'une personne de plus d'une voiture, il est souhaité? Je crois que votre modèle a besoin d'être plus raffiné ...
- Thats droit , Une personne ne devrait avoir qu'une voiture ,mais je veux que les utilisateurs soient en mesure de changer la voiture à partir de la liste déroulante.
- Si chaque personne a une seule voiture, le modèle est correct.
- Cela présente un scénario intéressant: Si l'utilisateur a, voiture de 1 déjà et l'utilisateur B est situé à aussi propre voiture 1... est-ce valable? Il aura une incidence sur la logique de votre programme de validation. Devrait "prendre" les voitures seront proposées dans la liste? Quelle est l'exigence?
InformationsquelleAutor Makky | 2013-11-22
Vous devez vous connecter pour publier un commentaire.
Vous souhaitez associer la voiture sélectionnée avec la personne.
Cependant, vous êtes à la liaison de la liste déroulante de la valeur à un générique backing bean de la propriété au lieu de la invidivual personne. Toutes ces listes déroulantes dans toutes ces lignes dans la même table de données pointent désormais à un seul et même backing bean propriété. Lors de l'envoi de la valeur de chaque ligne va s'écraser les unes les autres jusqu'à ce que le backing bean propriété se termine avec la valeur sélectionnée de la dernière ligne.
Ce n'est pas logique. Vous devez lier le menu déroulant de la valeur à la personne.
C'est plus facile si
Person
entité a unprivate Car car
de la propriété au lieu d'unprivate Long carID
. Vous pouvez bien sûr garder les éléments disponibles dans un autre bean.<f:selectItems itemValue>
à#{car.id}
et retirez le convertisseur. Votre code actuel, à savoir s'attend à unCar
de la propriété. Vraiment, j'aimerais utiliser un@OneToOne
ici avec un réelCar
de la propriété au lieu de seulement un ID.Basé sur BalusC réponse . Voici la solution.
Il liste les noms de voiture, mais l'affichage de celui qui a une personne.
Merci à tous pour votre réponse.
itemValue
est faux. Il devrait être#{car.id}
.Il ya un couple d'options.
La première est que vous pouvez changer le membre de votre
Person()
classe pour prendre un exemple deCar
au lieu d'uneinteger
decarId
:Alors votre dataTable pourrait ressembler à ceci:
...en supposant une
Car
pojo tels que:La deuxième est que vous pourriez ajouter un
getCarById()
méthode pour le backing bean et l'utiliser dans leDataTable
.Donc, dans votre page:
et dans le backing bean:
De nouveau, en supposant un
Car
pojo tels que: