使用SelectBooleanCheckbox可以保持多对多

时间:2013-08-29 15:16:52

标签: jsf jpa checkbox many-to-many persistence

我的问题类似于JPA persist many to many

但是,我有两个实体:角色和用户,具有多对多关系,由rolesusers表表示。在我的应用程序中,我使用的是JSF 2.0,我有一个用于操作用户数据的表单,一个包含所有角色名称列表的表单和一个用于查看用户角色的表单(如果是,则进行检查)。此外,它必须有可能添加或删除rol(检查或取消选中selectBooleanCheckbox),但是当我这样做时,我有两个问题:

1:要检查此用户的角色,我在selectBooleanCheckbox的值中有这样的语法:

<h:column>
 <f:facet name="header">
  <h:outputText value="ASIGNADO"/>
 </f:facet>
 <h:panelGroup rendered="#{usuariosController.selected.rolesList.contains(itemRole)}">
  <h:selectBooleanCheckbox value="#{true}">
   <f:ajax listener="#{rolesView.selectRoleListener(usuariosController.selected, itemRole)}" render="@form" />
  </h:selectBooleanCheckbox>
 </h:panelGroup>
 <h:panelGroup rendered="#{!usuariosController.selected.rolesList.contains(itemRole)}">
  <h:selectBooleanCheckbox value="#{false}">
   <f:ajax listener="#{rolesView.selectRoleListener(usuariosController.selected, itemRole)}" render="@form" />
  </h:selectBooleanCheckbox>
</h:panelGroup>
</h:column>

但是当执行selectRoleListener时,它会抛出javax.faces.component.UpdateModelException /users.xhtml @224,102 value="#{true}": Illegal Syntax for Set Operation

2:如果我删除value="#{true}"并将其替换为value="true",则当用户具有在列表中指定的角色时,不会选中该复选框,但似乎执行了selectRoleListener,但更改了在数据库中不可见。

你能帮我解决这个案子吗?我希望你能理解我。

谢谢!

1 个答案:

答案 0 :(得分:0)

到目前为止,看起来你错过了<h:selectManyCheckbox>中存在the standard JSF component set。这种过于复杂和不正确的方法可以简化如下:

<h:selectManyCheckbox value="#{bean.user.roles}">
    <f:selectItems value="#{bean.availableRoles}" />
</h:selectManyCheckbox>

(为简洁省略了转换器/标签/布局等)

其中#{bean}具有User user属性,而该属性又具有表示所选角色的List<Role> roles属性。然后有一个List<Role> availableRoles属性表示所有可用的角色(如果需要,可以在不同的,应用程序编写的bean中保存)。


关于你得到的PropertyNotWritableException:这是非常自我解释的,没有物业的设定者。换句话说,value="#{true}"根本不代表真正的模型属性。你应该引用一个模型属性,它具有一个getter和一个像#{bean.value}这样的setter。