1

私の質問はJPAに似ていますが、多対多に永続化されます

しかし、ロールとユーザーの 2 つのエンティティがあり、多対多の関係があり、rolesusers テーブルで表されます。私のアプリケーションでは、JSF 2.0 を使用しています。ユーザー データを操作するためのフォームと、すべてのロール名のリストを含むフォームと、ユーザーのロールを表示するための selectBooleanCheckbox があります (はいの場合はチェックされます)。さらに、ロールを追加または削除する (selectBooleanCheckbox をチェックまたはチェック解除する) 可能性が必要ですが、それを行うと、次の 2 つの問題があります。

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使用可能なすべてのロールを表すプロパティがあります (必要に応じて、アプリケーション スコープの別の Bean で保持できます)。


あなたが得たものに関しては、PropertyNotWritableExceptionそれはかなり自明です。プロパティのセッターはありません。つまり、 はvalue="#{true}"真のモデル プロパティをまったく表していません。そのようなゲッターとセッターを持つモデル プロパティを参照する必要があります#{bean.value}

于 2013-08-29T15:42:09.183 に答える