terça-feira, 31 de maio de 2011

Validado campo único com hibernate + Seam.

É possível validar que um campo seja único com o hibernate de uma maneira muito simples criando uma anotação hibernate, e a melhor parte é que depois de criado é possível utilizar de uma maneira muito simples para validar qualquer campo.

Vou mostrar como fazer isso utilizando o Hibernate + Seam.

Temos a nossa Entity com os seguintes campos.

@Entity
public class Cliente{

   private String nome;
   private Integer idade;

   //getters e setters
}
Queremos que o nosso campo Nome seja unico, não havendo 2 registros com o mesmo nome.
Para isso vamos criar uma anotação chamada @Unique.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ValidatorClass(UniqueImpl.class)
public @interface Unique {

   String message() default "Campo já existe";

   String classe();

   String campo();

}

Com a nossa annotation criada vamos criar nossa validação da anotação.

@Name("UniqueValidator")
public class UniqueImpl implements Validator<Unique>, PropertyConstraint {

   private String classe;
   private String campo;

   public void initialize(Unique arg) {
      targetEntity = ((Unique)arg).entityName();
      field = ((Unique)arg).fieldName();
   }

   public boolean isValid(Object obj) {
      EntityManager entityManager = (EntityManager) Component.getInstance("entityManager");
      Query query = entityManager.createQuery("select t from " + targetEntit + " t where t." + field + "  = :value");
      query.setParameter("value", obj);

   try {
      query.getResultList();
      return false;
   } catch (final NoResultException e) {
      return true;
   }
   }

   public void apply(Property arg0) {

   }
}
Vamos entender o que acontece na classe de validação da anotação.
É extendido as interfaces Validator<Unique>, PropertyConstraint e implementado os seus metodos.
No metodo initialize são passado os 2 parâmetros que devem ser passados para a anotação funcionar.
No metodo isValid é feito uma query com os 2 parâmetros que serão passados pela annotations (classe e campo)

A annotation esta criada, agora basta implementa-la na nossa entity.
@Unique(classe="org.domain.teste.entity.Cliente", campo="nome", message="Nome já existe")
public String getNome() {
   return nome;
}


E na nossa view



Nome

   
   inputWidth="200px;" id="nome" value="#{cliente.nome}"
  required="true" />
   
   

Pronto a annotations esta pronta e funcionando, e pode ser usada para validar a unicidade de qualquer campo.

Nenhum comentário:

Postar um comentário