1

我的问题类似于JPA 坚持多对多

但是,我有两个实体:角色和用户,具有多对多关系,由角色用户表表示。在我的应用程序中,我使用 JSF 2.0,我有一个表单来操作用户数据,还有一个包含所有角色名称列表的表单和一个 selectBooleanCheckbox 来查看用户的角色(如果是,则选中)。此外,它必须有可能添加或删除角色(选中或取消选中 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,但更改在数据库中不可见。

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

谢谢!

4

1 回答 1

0

到目前为止,您似乎以某种方式错过了标准 JSF 组件集中<h:selectManyCheckbox>存在的 a 。然后可以将这种过于复杂且不正确的方法简化如下:

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

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

其中#{bean}具有一个User user属性,该属性又具有List<Role> roles代表所选角色的属性。然后是一个List<Role> availableRoles代表所有可用角色的属性(如果需要,它可以保存在不同的、applicationscoped bean 中)。


至于PropertyNotWritableException你得到的:这很不言自明,该属性没有设置器。换句话说,value="#{true}"根本不代表真正的模型属性。您应该引用具有 getter 和 setter 这样的模型属性#{bean.value}

于 2013-08-29T15:42:09.183 回答