Как сравнить и проверить 2 поля при сохранении сущности, используя Facelets + JPA? - PullRequest
1 голос
/ 09 декабря 2010

Я использую Шов 2.2 с Facelets, и мне нужно проверить 2 поля из объекта JPA, сравнивая оба поля, чтобы проверить его значения перед вставкой.

Вот фрагмент из моей сущности:

@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>

Мне нужно сравнить эти 2 поля, прежде чем ясохраните их и проверьте, не отличаются ли они от 0f, а также, меньше ли abastecimentoMinimo, чем abastecimentoMaximo.Как я могу сделать это, используя Seam + Facelets + JPA?

[] s

1 Ответ

2 голосов
/ 09 декабря 2010

Проверка поля в JSF 1 невозможна. Так что вы должны сделать это вручную.

В вашем случае это можно сделать либо с помощью @PrePersist и @PreUpdate, либо вы можете сделать это вручную в методе действий.

Один совет для вас. Избегайте использования компонентов Entity в качестве компонентов шва. Лучше сделать отдельный компонент шва.

Причины этого:

Бины сущностей могут быть связаны с переменной контекста и функционировать как компонент шва. Поскольку сущности имеют постоянную идентичность в дополнение к их контекстуальной идентичности, экземпляры сущностей обычно явно связаны в коде Java, а не неявно создаются экземплярами в Seam.

Компоненты сущностного компонента не поддерживают биекцию или разграничение контекста. Вызов объекта EJB также не запускает проверку. Объектные компоненты обычно не используются в качестве прослушивателей действий JSF, но часто функционируют в качестве вспомогательных компонентов, предоставляющих свойства компонентам JSF для отображения или отправки формы. В частности, часто используют объект в качестве вспомогательного компонента вместе с прослушивателем действия сессионного компонента без сохранения состояния для реализации функциональности создания / обновления / удаления типа. По умолчанию бины сущностей привязаны к контексту диалога. Возможно, они никогда не будут связаны с контекстом без гражданства.

Обратите внимание, что в кластеризованной среде несколько менее эффективно связывать объектный компонент напрямую с контекстной переменной Seam в области диалога или сеанса, чем для хранения ссылки на объектный компонент в компоненте сеанса с сохранением состояния. По этой причине не все приложения Seam определяют компоненты управления данными как компоненты 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!");
    }
}
...