2010-12-09 47 views
1

我正在使用Seam 2.2與Facelets,我需要驗證JPA實體的兩個字段,比較兩個字段在插入前檢查其值。如何使用Facelets + JPA持久化實體時比較和驗證2個字段?

這裏是我的enttity片段:

@Entity 
@Scope(ScopeType.CONVERSATION) 
@Name("metaAbastecimento") 
public class MetaAbastecimento implements Serializable{ 
private float abastecimentoMinimo; 

private float abastecimentoMaximo; 


@Column 
public float getAbastecimentoMinimo() { 
    return abastecimentoMinimo; 
} 

@Column 
public float getAbastecimentoMaximo() { 
    return abastecimentoMaximo; 
} 

public void setAbastecimentoMinimo(float abastecimentoMinimo) { 
    this.abastecimentoMinimo = abastecimentoMinimo; 
} 

public void setAbastecimentoMaximo(float abastecimentoMaximo) { 
    this.abastecimentoMaximo = abastecimentoMaximo; 
} 
} 

比我有堅持這個實體的XHTML:

<rich:panel> 
     <f:facet name="header">Detalhe de Meta de Abastecimento</f:facet> 


     <s:decorate id="abastecimentoMinimo" template="../layout/display.xhtml"> 
      <ui:define name="label">Meta(R$) de Abastecimento M&iacute;nimo</ui:define> 
      <h:outputText value="#{metaAbastecimentoHome.instance.abastecimentoMinimo}"> 
      </h:outputText> 
     </s:decorate> 

     <s:decorate id="abastecimentoMaximo" template="../layout/display.xhtml"> 
      <ui:define name="label">Meta(R$) Abastecimento M&aacute;ximo</ui:define> 
      <h:outputText value="#{metaAbastecimentoHome.instance.abastecimentoMaximo}"/> 
     </s:decorate> 

     <div style="clear:both"/> 

    </rich:panel> 

我需要之前,我堅持他們對比這兩個領域,並檢查它們是否與0f不同,並且如果abastecimentoMinimo小於abastecimentoMaximo。我如何使用Seam + Facelets + JPA來做到這一點?

[] s

+0

如果對值的約束不適用,會發生什麼? – kraftan 2010-12-09 05:16:04

回答

2

JSF 1中的交叉字段驗證是不可能的。所以你必須手動完成。

這可以通過使用@PrePersist和​​來完成,或者您可以在您的操作方法中手動執行此操作。

給你一個提示。避免讓實體bean作爲縫合組件。最好製作一個單獨的接縫部件。

造成這種情況的原因是:

實體豆可以被綁定到一個上下文變量並且用作接縫部件。由於實體除了具有上下文身份之外還具有持久性標識,因此實體實例通常在Java代碼中顯式綁定,而不是由Seam隱式地實例化。

實體Bean組件不支持雙注或上下文分界。也沒有調用實體bean觸發器驗證。 實體bean通常不被用作JSF動作偵聽器,但通常用作爲JSF組件提供屬性以顯示或提交表單的支持bean。特別是,通常使用實體作爲支持bean,以及無狀態會話bean動作偵聽器來實現創建/更新/刪除類型功能。 默認情況下,實體bean綁定到對話上下文。他們可能永遠不會受到無國籍的情況的約束。

。注意,在集羣環境中是稍差有效的實體bean直接綁定到一個對話或會話範圍的Seam上下文變量比將保持在狀態會話bean到實體bean的引用。出於這個原因,並不是所有的Seam應用程序都將實體bean定義爲Seam組件。

@Entity 
public class MetaAbastecimento { 
    ..... 

    //If check fails you can throw exception, thus rollback will occur, and commit will not be made 
    @PrePersist 
    @PreUpdate 
    public void check() { 
     if(abastecimentoMinimo == 0f || abastecimentoMaximo == 0f && abastecimentoMinimo > abastecimentoMaximo) 
     throw new RuntimeException("Failed!"); 
    } 
} 
+0

+1,因爲那也是我的建議解決方案。我只是想先問一個例外是否是@Marcos Maia約束檢查的有效結果。 – kraftan 2010-12-09 10:26:38

相關問題