Cet exemple est purement éducatif et permet de donner un exemple simple pour se lancer dans la personnalisation de validateurs Hibernate. On peut imaginer créer des validateurs pour vérifier qu'un nombre est plus grand qu'un seuil défini par exemple.

/*
 * 
 */
package com.philippevoncken.hibernate.validator;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.hibernate.validator.ValidatorClass;

/**
 * L'interface FractionDigits .
 */
@ValidatorClass(FractionDigitsValidator.class)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FractionDigits {

  /**
   * Value.
   */
  int value() default 0;

  /**
   * Message.
   */
  String message() default "{validator.fractiondigits}";
}
package com.philippevoncken.hibernate.validator;

import java.io.Serializable;

import org.hibernate.mapping.Column;
import org.hibernate.mapping.Property;
import org.hibernate.validator.PropertyConstraint;
import org.hibernate.validator.Validator;

/**
 * Classe objet FractionDigitsValidator .
 */
public class FractionDigitsValidator implements Validator<FractionDigits>, PropertyConstraint, Serializable {

  /** l'attribut min. */
  private int nb = 0;

  /**
   * Constructeur strict min validator.
   */
  public FractionDigitsValidator() {
    super();
  }

  /**
   * {@inheritDoc}
   */
  public void apply(final Property property) {
    Column vCol = (Column) property.getColumnIterator().next();
    vCol.setScale(this.nb);    
  }

  /**
   * {@inheritDoc}
   */
  public void initialize(final FractionDigits pParameters) {
    this.nb = pParameters.value();
  }

  /**
   * {@inheritDoc}
   */
  public boolean isValid(final Object pValue) {
    if (pValue == null) {
      return true;
    }
    String vString = String.valueOf(pValue);
    int vIndexPoint = vString.indexOf('.') + 1;
    if (vIndexPoint < 0) {
      return true;
    }
    int vLength = vString.length();
    
    return (vLength - vIndexPoint) <= this.nb;
  }
}

Une fois le validateur définie il n'y a plus qu'à utiliser l'annotation @FractionDigits(2) sur le getter de l'attribut float à vérifier pour être sûr qu'il n'y aura jamais plus de deux chiffres après la virgule.