2013-08-29 89 views
1

我的問題是類似JPA persist many to many堅持多對多與SelectBooleanCheckbox

不過,我有兩個實體:角色和用戶,有一個多對多的關係,由rolesusers表表示。在我的應用程序中,我使用的是JSF 2.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}": Illegal Syntax for Set Operation

2:如果我刪除value="#{true}"value="true"取代它,不選中該複選框,當用戶在列表中指定的角色,但似乎執行selectRoleListener,但變化不是在數據庫中可見。

你能幫我解決這個問題嗎?我希望你能理解我。

謝謝!

+0

這不是JSF中複選框的正確用法。首先,是否有一個特定的原因,你爲什麼使用''而不是僅僅是一個''? – BalusC

+0

不是。它只是用於操縱角色列表(用於角色表中的所有角色)。但我沒有想到它 –

回答

0

到目前爲止,它看起來像你不知何故錯過the standard JSF component set之間存在<h:selectManyCheckbox>。如下這種過於複雜的和不正確的方法然後可以簡化爲:

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

(轉換器/標籤/佈局等爲了簡潔省略)

其中#{bean}具有User user特性又具有一個List<Role> roles屬性代表選定的角色。然後有一個List<Role> availableRoles屬性表示所有可用的角色(如果需要,可以將其保存在不同的應用程序範圍的bean中)。


至於你得到了PropertyNotWritableException:那是相當自我解釋,有一個爲屬性的setter。換句話說,value="#{true}"根本不代表真正的模型屬性。你應該引用一個模型屬性,它有一個吸氣劑和一個像這樣的。

+0

謝謝你的回答。我使用屬性'value =「#{true}」',因爲當列表中的角色是用戶的角色時,它沒有檢查selectBooleanCheckbox。但我會嘗試selectManyCheckbox。謝謝! –