This was simple....
<rich:pickList value="#{event.sponsorDetails.sponsors}"> <s:selectItems value="#{availableUsers}" var="eachUser" label="#{eachUser.surname} , #{eachUser.firstname}"/> <s:convertEntity/> </rich:pickList>
Or so I thought...
@Out(value="availableUsers",required=true) private List<User> availableUsers = new ArrayList<User>();
/* (non-Javadoc) * @see nz.co.selwynequestriancentre.action.eventsManagement.EventsManagementController#findUsers() */ @Factory("availableUsers") @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) @Override public void findUsers() { if (availableUsers.isEmpty()) { availableUsers = (List<User>)entityManager.createQuery("from User u order by u.surname asc").getResultList(); } }
simply does not cut it!
You get a very strange error from JSF...
Validation Error: Value is not valid
What this eventually came to (possibly) is that you need to override the default equals method!
Right or Wrong I used:
@Override public boolean equals(Object o) { return this.getId() == ((User)o).getId(); }
This now appaered to work until I persisted the containing entity and I got a detachedEntityException.. ARGH!
So had to add:
List<User> sponsorsToAdd = new ArrayList<User>(); for (User eachSponsor : this.event.getSponsorDetails().getSponsors()) { sponsorsToAdd.add(entityManager.merge(eachSponsor)); // Re-Attach the Sponsor object. }
This seems a very big workaround to get this to work... is this kind of feature being addressed in JSF2?
As I have not actually persisted this yet due to other problems I still have not seen this work, but feel confident.
Richfaces documentation updated.