2013-10-11 2 views
0

Soirée!Ajouter des entités à un <Collection> dans JSF en utilisant selectonemenu et/ou selectmanymenu

J'ai une structure de base de données qui inclut une table de jointure (groupes d'utilisateurs) qui relie l'entité Utilisateurs aux entités du groupe à des fins d'autorisation. C'est une relation plusieurs-à-plusieurs (les utilisateurs sont le propriétaire). En suivant les conseils fournis par BalusC dans d'autres publications, j'utilise le convertisseur personnalisé SelectItemsConverter fourni par le framework Omnifaces qui me permet de remplir correctement le menu déroulant avec les entités du groupe mais je n'arrive pas à trouver la syntaxe correcte puis ajoutez-les aux groupes détenus par l'entité Users. Dans l'état actuel des choses, le code va essayer de convertir une entité de groupe en un résultat terminal! Après avoir creusé un peu, je me demande si j'ai besoin de lier la référence à la vue d'une façon ou d'une autre et de passer la référence à la méthode Add de groupe quand le formulaire est soumis mais cela semble un peu maladroit et je ne trouve rien cela confirme ma théorie. Pointers quelqu'un?

utilisateurs entité:

@Entity 
@Table(name = "Users") 
@XmlRootElement 
... 
public class Users implements Serializable { 
... 
    @JoinTable(name = "User_Groups", joinColumns = { 
     @JoinColumn(name = "User_ID", referencedColumnName = "User_ID")}, inverseJoinColumns = { 
     @JoinColumn(name = "Group_ID", referencedColumnName = "Group_ID")}) 
    @ManyToMany 
    private Collection<Groups> groupsCollection; 
... 

entité Groupes:

@Entity 
@Table(name = "Groups") 
... 
public class Groups implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "Group_ID") 
    private Integer groupID; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 20) 
    @Column(name = "Group_Name") 
    private String groupName; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 200) 
    @Column(name = "Group_Desc") 
    private String groupDesc; 
    @ManyToMany(mappedBy = "groupsCollection") 
    private Collection<Users> usersCollection; 
... 
fragment de code

de créer des utilisateurs Page JSF:

... 
<h:outputLabel value="#{bundle.CreateUsersLabel_groups}" for="groupsCollection" /> 
<h:selectOneMenu id="groupsCollection" value="#{usersController.selected.groupsCollection}" title="#{bundle.CreateUsersTitle_groups}" converter="omnifaces.SelectItemsConverter"> 
    <f:selectItems value="#{groupsController.itemsAvailableSelectOne}" /> 
</h:selectOneMenu> 
... 
+0

Vous n'utilisez pas 'h: selectOneMenu' correctement. Ce composant renvoie une seule sélection, pas une collection comme vous le prétendez ('# {usersController.selected.groupsCollection}'). –

+0

Fair point. Je fais évidemment quelque chose de mal mais qu'est-ce que j'utilise à la place? J'ai besoin de remplir une propriété Collection dans le champ Utilisateurs avec une (ou plusieurs) entités Groupes. Le SelectOneMenu (ou une alternative) doit être rempli avec ces entités, pas la Collection. – rustproofFish

Répondre

0

Je pense que ce dont vous avez besoin est ah: selectManyCheckbox, h : selectManyListbox ou h: selectManyMenu, tout ce qui vous permet de sélectionner plusieurs groupes en même temps pour les associer w avec votre utilisateur. Essayez ceci:

<h:outputLabel value="#{bundle.CreateUsersLabel_groups}" for="groupsCollection" /> 
    <h:selectManyMenu id="groupsCollection" 
     value="#{usersController.selected.groupsCollection}" 
     title="#{bundle.CreateUsersTitle_groups}" converter="omnifaces.SelectItemsConverter"> 
    <f:selectItems value="#{groupsController.itemsAvailableSelectOne}" /> 
</h:selectManyMenu> 
+0

Bingo! Ça marche. Comme avec beaucoup de problèmes que j'ai rencontrés avec JSF jusqu'ici, la solution est agilement simple! Cependant, existe-t-il un moyen de permettre uniquement à l'utilisateur de sélectionner un seul groupe? En l'occurrence, cette implémentation fonctionne correctement pour le moment, mais j'aimerais avoir cette flexibilité pour le développement futur. Merci encore :-) Mes cheveux auront une chance de repousser maintenant ... – rustproofFish

+0

Si vous voulez permettre à l'utilisateur de sélectionner un seul groupe, alors vous devriez utiliser le h: selectOneMenu. Mais, contrairement à ce que vous faisiez, la propriété "value" de selectOneMenu doit pointer une Entité, pas une Collection. Quelque chose comme andremonteiro

+0

Excellent. Merci pour la clarification - je vais essayer – rustproofFish

Questions connexes