2012-10-15 42 views
2

我有這樣的代碼:重置的p值:在的inputText號碼:就地當DB約束驗證失敗

<p:inplace id="staffno" editor="true"> 
        <p:ajax event="save" listener="#{staffbean.onSave}" update="staffnoInplace messages" />      
        <p:inputText id="staffnoInplace" value="#{staffbean.vieweditStaff.staffno}"/>             
</p:inplace> 

在staffbean.onSave()我存儲此通過JPA /休眠。在成功的情況下,我不會面臨任何問題。它存儲在數據庫中。

我的問題與Hibernate由於數據庫約束引發異常的情況有關。在這些情況下,我希望將就地保持在可編輯狀態,而不是更改值。目前,它在數據庫級別上失敗,但仍然將UI對象上的值更改爲不正確的值。

回答

2

您應該包含inputText組件的驗證方法或驗證程序,以便在給定ID已經存在於數據庫中時反轉bean值並阻止執行onSave事件。

故意嘗試將記錄插入數據庫希望提供驗證的數據庫約束是一種模糊的數據安全實踐。我並不是說數據庫的限制是不好的,我只是說在嘗試插入數據庫之前,你應該盡一切努力來驗證和傳遞你的輸入。

包括像這樣在您的管理bean中的驗證方法:

public void validateStaffNoId(FacesContext context, UIComponent component, Object value) 
     throws ValidatorException { 
    //Query DB to see if ID exists... 
    if (idExists()) { 
     //Throw validator exception 
    } 
} 
在inputText組件

然後,只需添加屬性:

<p:inputText ... validator="#{staffBean.validateStaffNoId}" ... /> 
+0

我曾希望避免這種情況,因爲這意味着我必須請執行額外的DB查詢以驗證實體的存在。有沒有其他方法?我能否以其他方式扭轉bean?爲什麼依賴於約束例外是不好的? – javaMS

+1

@javaMS'依賴於約束異常是不好的嗎?'這是一個非常好的問題,至今仍在爭論。請看這裏:http://programmers.stackexchange.com/questions/76052/constraints-in-a-relational-databases-why-not-remove-them-completely –

+0

@javaMS在JSF的情況下,有驗證階段整個框架將根據應用程序驗證處理應用和回滾值。 JSF鼓勵這種模式,所以最好這樣做,而不管你對這個主題的感受如何。還有一點是,通過執行引用完整性,一些數據庫的執行比通過提取單個記錄的執行更差。如果表格已正確編制索引,則預取此記錄的性能損失應該很小。 –