栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Hibernate唯一密钥验证

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Hibernate唯一密钥验证

一种可能的解决方案是创建自定义

@UniqueKey
约束(和相应的验证器)。并要查找数据库中的现有记录,请提供
EntityManager
(或Hibernate
Session
)to 的实例
UniqueKeyValidator

EntityManagerAwarevalidator

public interface EntityManagerAwarevalidator {       void setEntityManager(EntityManager entityManager); }

ConstraintValidatorFactoryImpl

public class ConstraintValidatorFactoryImpl implements ConstraintValidatorFactory {    private EntityManagerFactory entityManagerFactory;    public ConstraintValidatorFactoryImpl(EntityManagerFactory entityManagerFactory) {        this.entityManagerFactory = entityManagerFactory;    }    @Override    public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) {        T instance = null;        try { instance = key.newInstance();        } catch (Exception e) {  // could not instantiate class e.printStackTrace();        }        if(EntityManagerAwarevalidator.class.isAssignableFrom(key)) { EntityManagerAwarevalidator validator = (EntityManagerAwarevalidator) instance; validator.setEntityManager(entityManagerFactory.createEntityManager());        }        return instance;    }}

唯一键

@Constraint(validatedBy={UniqueKeyValidator.class})@Target({ElementType.TYPE})@Retention(RUNTIME)public @interface UniqueKey {    String[] columnNames();    String message() default "{UniqueKey.message}";    Class<?>[] groups() default {};    Class<? extends Payload>[] payload() default {};    @Target({ ElementType.TYPE })    @Retention(RUNTIME)    @documented    @interface List {        UniqueKey[] value();    }}

UniqueKeyValidator

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;    }}

用法

@UniqueKey(columnNames={"userName"})// @UniqueKey(columnNames={"userName", "emailId"}) // composite unique key//@UniqueKey.List(value = {@UniqueKey(columnNames = { "userName" }), @UniqueKey(columnNames = { "emailId" })}) // more than one unique keyspublic class User implements Serializable {    private String userName;    private String password;    private String emailId;    protected User() {        super();    }    public User(String userName) {        this.userName = userName;    }        ....}

测试

public void uniqueKey() {    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("default");    ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();    ValidatorContext validatorContext = validatorFactory.usingContext();    validatorContext.constraintValidatorFactory(new ConstraintValidatorFactoryImpl(entityManagerFactory));    Validator validator = validatorContext.getValidator();    EntityManager em = entityManagerFactory.createEntityManager();    User se = new User("abc", poizon);       Set<ConstraintViolation<User>> violations = validator.validate(se);    System.out.println("Size:- " + violations.size());    em.getTransaction().begin();    em.persist(se);    em.getTransaction().commit();        User se1 = new User("abc");    violations = validator.validate(se1);    System.out.println("Size:- " + violations.size());}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390906.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号