我的问题类似于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,但更改了在数据库中不可见。
你能帮我解决这个案子吗?我希望你能理解我。
谢谢!
答案 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。