hibernate unique key validation

后端 未结 6 770
后悔当初
后悔当初 2020-12-23 22:36

I have a field, say, user_name, that should be unique in a table.

What is the best way for validating it using Spring/Hibernate validation?

6条回答
  •  Happy的楠姐
    2020-12-23 23:14

    This code is based on the previous one implemented using EntityManager. In case anyone need to use Hibernate Session. Custom Annotation using Hibernate Session.
    @UniqueKey.java

    import java.lang.annotation.*;
    import javax.validation.Constraint;
    import javax.validation.Payload;
    
    @Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = UniqueKeyValidator.class)
    @Documented
    public @interface UniqueKey {
        String columnName();
        Class className();
        String message() default "{UniqueKey.message}";
        Class[] groups() default {};
        Class[] payload() default {};
    }
    

    UnqieKeyValidator.java

    import ch.qos.logback.classic.gaffer.PropertyUtil;
    import org.hibernate.Criteria;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.criterion.Restrictions;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Repository;
    import org.springframework.transaction.annotation.Transactional;
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Method;
    @Transactional
    @Repository
    public class UniqueKeyValidator implements ConstraintValidator {
    
        @Autowired
        private SessionFactory sessionFactory;
    
        public Session getSession() {
            return sessionFactory.getCurrentSession();
        }
    
        private String columnName;
        private Class entityClass;
    
        @Override
        public void initialize(UniqueKey constraintAnnotation) {
            this.columnNames = constraintAnnotation.columnNames();
            this.entityClass = constraintAnnotation.className();
        }
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            Class entityClass = this.entityClass;
            System.out.println("class: " + entityClass.toString());
            Criteria criteria = getSession().createCriteria(entityClass);
            try {
                    criteria.add(Restrictions.eq(this.columnName, value));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return criteria.list().size()==0;
        }
    }
    

    Usage

    @UniqueKey(columnNames="userName", className = UserEntity.class)
    // @UniqueKey(columnNames="userName") // unique key
    

提交回复
热议问题