当前位置: 首页 > 知识库问答 >
问题:

使用SelectBooleanCheckbox将多对多持久化

徐嘉谊
2023-03-14

但是,我有两个实体:角色和用户,它们具有多对多的关系,这由rolesusers表表示。在我的应用程序中,我使用的是JSF2.0,我有一个表单来操作用户数据,还有一个表单,它包含所有角色名称的列表和一个selectBooleanCheckbox来查看用户的角色(如果是,则选中)。此外,它必须有添加或删除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}”:Set operation的非法语法。

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

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

谢谢你!

共有1个答案

刘焱
2023-03-14

到目前为止,您似乎错过了标准JSF组件集中存在 。这种过于复杂和不正确的方法可以简化如下:

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

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

其中#{bean}具有user user属性,该属性又具有表示所选角色的list roles 属性。然后有一个list availableRoles 属性表示所有可用的角色(如果需要,可以将其保存在不同的applicationscoped bean中)。

 类似资料:
  • 谢谢 ----更新----

  • persistenceException:DB2 SQL错误:sqlcode=-206,sqlstate=42703,sqlerrmc=t0.id,driver=3.52.95{prepstmnt 1029586270

  • 问题内容: 我在很大程度上依赖localStorage来编写插件。所有用户设置都存储在其中。有些设置要求用户写正则表达式,如果他们的正则表达式规则在某个时候消失了,他们会感到很遗憾。所以现在我想知道localStorage的持久性如何。 从规格: 用户代理应仅出于安全原因或在用户要求时才使本地存储区中的数据过期。 上面看起来像在客户端上的cookie一样工作。即,当用户清除所有浏览器数据(历史记录

  • 我试图持久化一个非常简单的单向一对多关系,但EclipseLink(2.3.1)失败了。 服务类(父级):

  • 问题内容: 我使用带有注释的Hibernate 3.5.2-FINAL来指定我的持久性映射。我正在努力对应用程序和一组平台之间的关系进行建模。每个应用程序都可用于一组平台。 从我完成的所有阅读和搜索中,我认为我需要让平台枚举类作为Entity持久化,并需要一个联接表来表示多对多关系。我希望该关系在对象级别是单向的,也就是说,我希望能够获得给定应用程序的平台列表,但是我不需要找出给定平台的应用程序列

  • 问题内容: 我尝试使用 多个线程 持久化对象时遇到问题。 细节 : 假设我有一个对象,该对象具有(一对多关系)列表,并且又包含(一对多关系)列表。 由于数量庞大(以十万计),我基于(基于某些业务逻辑)将其分组,并创建了 WORKER 线程(每个PaymentGroup一个线程)以形成对象并提交到数据库中。 问题是,每个工作线程都创建一个(包含唯一的一组)。 所有实体的主键都是自动生成的。 因此,存