IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Validation for uniqueness constraint consisting of multiple columns


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Validation for uniqueness constraint consisting of multiple columns
    Salut,
    Pour valider l'unicité d'un champs jj'ai utilisé la proprité "unique" de @Column
    Voici ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    @Entity
    @Table(name="TEST")
    public class Test{
     
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
     
        @Size(min=3, max=50)
        @Column(name = "AA", nullable = false)
        private String aa;
     
     
        @NotNull
        @Digits(integer=8, fraction=2)
        @Column(name = "BB", nullable = false)
        private BigDecimal bb;
     
        @NotEmpty
        @Column(name = "CC", unique=true, nullable = false)
        private String cc;
     
    }
    En cas d'erreur de validation j'utilise le fichier messages.properties dont le contenu est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Size.test.aa= must be between {2} and {1} characters long
    NotNull.test.bb= can not be blank
    Digits.test.bb=Only numeric data with max 8 digits and with max 2 precision is allowed
    NotEmpty.test.cc= can not be blank
    non.unique.cc=CC {0} already exist. Please fill in different value.
    jusqu’à la tous fonctionne parfaitement quand j'essaye de valider une valeur de "cc" déjà existante dans la BD, le message "CC {0} already exist. Please fill in different value" est affichée.

    le probleme maintenant est que j'ai une 2 classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    @Entity
    @Table(name="TEST1", uniqueConstraints = {
            @UniqueConstraint(columnNames = { "xx", "yy"}) })
    public class Test1{
     
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
     
        @NotBlank
        @Column(name = "XX", nullable = false)
        private String xx;
     
     
        @NotBlank
        @Column(name = "YY", nullable = false)
        private String yy;
     
        @NotBlank
        @Column(name = "ZZ", nullable = false)
        private String zz;
     
    }
    comment dois je traiter avec une contrainte d'unicité sur plusieurs champs? je voudrais affiché un message comme j'ai fais pour le champs "cc", indiquant au USer comme quoi la combine des 2 champs saisi existe deja ..

    MERCI

  2. #2
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 136
    Par défaut
    Si tu utilise les hibernate validation (ce qui est probablement le cas), tu as les customs contraint :
    http://docs.jboss.org/hibernate/stab...tomconstraints

    Ce qui te permet de faire ce que tu veux niveau vérifications.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bilgetz Voir le message
    Si tu utilise les hibernate validation (ce qui est probablement le cas), tu as les customs contraint :
    http://docs.jboss.org/hibernate/stab...tomconstraints

    Ce qui te permet de faire ce que tu veux niveau vérifications.
    merci pour votre reponse..
    après des recherche j'ai trouvé ce bout de code qui fonctionne en utilisant EntityManager
    par contre dans mon cas , j'utilise SessionFactory..
    avez vous une idees comment modifier ce code pour aboutir au mm resultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    public class UniqueKeyValidator implements ConstraintValidator<UniqueKey, Serializable>, EntityManagerAwareValidator {
     
        private EntityManager entityManager;
     
        @Override
        public void setEntityManager(EntityManager entityManager) {
            this.entityManager = entityManager;
        }
     
        private String[] columnNames;
     
        @Override
        public void initialize(UniqueKey constraintAnnotation) {
            this.columnNames = constraintAnnotation.columnNames();
     
        }
     
        @Override
        public boolean isValid(Serializable target, ConstraintValidatorContext context) {
            Class<?> entityClass = target.getClass();
     
            CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
     
            CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();
     
            Root<?> root = criteriaQuery.from(entityClass);
     
            List<Predicate> predicates = new ArrayList<Predicate> (columnNames.length);
     
            try {
                for(int i=0; i<columnNames.length; i++) {
                    String propertyName = columnNames[i];
                    PropertyDescriptor desc = new PropertyDescriptor(propertyName, entityClass);
                    Method readMethod = desc.getReadMethod();
                    Object propertyValue = readMethod.invoke(target);
                    Predicate predicate = criteriaBuilder.equal(root.get(propertyName), propertyValue);
                    predicates.add(predicate);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
     
            criteriaQuery.where(predicates.toArray(new Predicate[predicates.size()]));
     
            TypedQuery<Object> typedQuery = entityManager.createQuery(criteriaQuery);
     
            List<Object> resultSet = typedQuery.getResultList(); 
     
            return resultSet.size() == 0;
        }
     
    }
    surtout au niveau de TypedQuery & CriteriaBuilder ..

    voici ce que j’ai pu faire jusqu’à présent, mais il reste une erreur au niveau de la ligne commenté, et je suis pas sure du typage que j'ai fait pour le CriteriaBuilder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    public class FuSsA_UniqueKeyValidator implements ConstraintValidator<FuSsA_UniqueKey, Serializable> {
     
    @Autowired
    private SessionFactory sf;
     
    private String[] column_NMS;
     
    @Override
    public void initialize(FuSsA_UniqueKey constraint_Annota) {
            this.column_NMS = constraint_Annota.columnNames();
     
        }
     
    @Override
    public boolean isValid(Serializable target, ConstraintValidatorContext context) {
    Class<?> entityClass = target.getClass();
            CriteriaBuilder criteriaBuilder = (CriteriaBuilder) sf.getCurrentSession().createCriteria(entityClass);
            CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();
            Root<?> root = criteriaQuery.from(entityClass);
            List<Predicate> predicates = new ArrayList<Predicate>(column_NMS.length);
     
            try {
                for (int i = 0; i < column_NMS.length; i++) {
                    String propertyName = column_NMS[i];
                    PropertyDescriptor desc = new PropertyDescriptor(propertyName, entityClass);
                    Method readMethod = desc.getReadMethod();
                    Object propertyValue = readMethod.invoke(target);
                    Predicate predicate = criteriaBuilder.equal(root.get(propertyName), propertyValue);
                    predicates.add(predicate);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
     
            criteriaQuery.where(predicates.toArray(new Predicate[predicates.size()]));
     
    // error !!
            TypedQuery<Object> typedQuery = sf.getCurrentSession().createQuery(criteriaQuery); 
     
            List<Object> resultSet = typedQuery.getResultList();
            return resultSet.size() == 0;
        }
    }

Discussions similaires

  1. Eviter un UNIQUE CONSTRAINT sur un INSERT
    Par Manlis dans le forum PL/SQL
    Réponses: 1
    Dernier message: 29/07/2008, 09h43
  2. ORA-00001: unique constraint (%s.%s) violated
    Par Louisa2005 dans le forum SQL
    Réponses: 1
    Dernier message: 14/06/2007, 16h58
  3. Réponses: 3
    Dernier message: 25/09/2006, 15h48
  4. [Imp]"unique constraint violated" sur un import
    Par u_roisin dans le forum Oracle
    Réponses: 10
    Dernier message: 16/02/2006, 10h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo