selectManyMenu validation error
jonathan.shin Mar 27, 2007 4:01 PMI created EJB3 ManyToMany entities. User has a many to many relationship with Role. A user can have zero or more roles, and a role can have zero or more users. But, I?m getting validation error (?roles: Value is not a valid option?) when I clicked the ?Save? button.
User Entity:
@Entity
@Table(name = "User")
public class User implements java.io.Serializable {
...
@ManyToMany
@JoinTable(name="User_Role",
 joinColumns=@JoinColumn(name="user_id", referencedColumnName="user_id"),
 inverseJoinColumns=@JoinColumn(name="role_id", referencedColumnName="role_id")
 )
public List<Role> getRoles() {
 return this.roles;
}
public void setRoles(List<Role> roles) {
 this.roles = roles;
}
}
UserHome Object:
@Name("userHome")
public class UserHome extends EntityHome<User> {
 public void setUserUserId(Integer id) {
 setId(id);
 }
 public Integer getUserUserId() {
 return (Integer) getId();
 }
 @Override
 protected User createInstance() {
 User user = new User();
 return user;
 }
...
 public List<Role> getRoles() {
 return getInstance() == null ? null : new ArrayList<Role>(
 getInstance().getRoles());
 }
}
Role Entity:
@Entity
@Name("role")
@Scope(SESSION)
@Table(name = "Role")
public class Role implements java.io.Serializable
{
 private int roleId;
 private String name;
 private List<User> users;
 public Role()
 {
 System.out.println("Default Constructor");
 }
...
 @Column(name = "NAME", length = 50)
 @Length(max = 50)
 @NotNull
 public String getName()
 {
 return this.name;
 }
 public void setName(String name)
 {
 this.name = name;
 }
 @ManyToMany(mappedBy = "roles")
 public List<User> getUsers()
 {
 return this.users;
 }
 public void setUsers(List<User> users)
 {
 this.users = users;
 }
}
Converter:
@Name("converters")
public class Converters
{
 @Transactional
 public Converter getRoleConverter() {
 return new Converter() {
 @Transactional
 public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) throws ConverterException
 {
 if (arg2 == null) {
 return null;
 }
 try {
 return ((EntityManager) Component.getInstance("entityManager")).find(Role.class, Integer.valueOf(arg2));
 } catch (NumberFormatException e) {
 throw new ConverterException("Cannot find selected Role", e);
 }
 }
 @Transactional
 public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) throws ConverterException
 {
 if (arg2 instanceof Role)
 {
 Role role = (Role) arg2;
 Integer tempId = (Integer) role.getRoleId();
 return tempId.toString();
 }
 else
 {
 return null;
 }
 }
 };
 }
}
UserEdit.xhtml view:
...
 <h:outputLabel for="role">
 Roles
 </h:outputLabel>
 <s:decorate id="roleDecoration">
 <h:selectManyMenu id="roles" value="#{userHome.instance.roles}" size="5" converter="#{converters.roleConverter}">
 <s:selectItems value="#{roleList.resultList}" var="role" label="#{role.name}" noSelectionLabel="Please Select..." hideNoSelectionLabel="true"/>
 </h:selectManyMenu>
 </s:decorate>
...
 <h:commandButton id="save"
 value="Save"
 action="#{userHome.persist}"
 disabled="#{!userHome.wired}"
 rendered="#{!userHome.managed}"/>
...
 
    