0

値が一意であることを検証するカスタム制約が必要です。私は良い例を見つけるために長い間インターネットを検索してきました。私が見つけたのは、もう推奨されていない休止状態のテンプレートを使用しているため、テンプレートを使用しないようにこのコードを「変換」する専門知識を持っている人はいないかと思いました。私は自分でやろうとしましたが、ゲッターとセッターが何のためにあるのかわかりません。これが私がこの役立つガイドから得たコードです。

package com.omgo.security.domain.validator;

import java.io.Serializable;
import java.util.List;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;

public class UniqueIDValidator implements ConstraintValidator<Unique, Serializable> {

HibernateTemplate hibernateTemplate;

private Class<?> entityClass;
private String uniqueField;

public void initialize(Unique unique) {
    entityClass = unique.entity();
    uniqueField = unique.property();
}

public boolean isValid(Serializable property, ConstraintValidatorContext cvContext) {

    String query = String.format("from %s where %s = ? ", entityClass.getName(), uniqueField);
    List<?> list = hibernateTemplate.find(query, property);

    return list != null && list.size() > 0;
}

public SessionFactory getSessionFactory() {
    return hibernateTemplate != null ? hibernateTemplate.getSessionFactory() : null;
}

@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
    this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}
}

ご協力ありがとうございました。

/ D

更新 コードを変更した後、次のエラーが発生します。

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

だから私はおそらくSessionFactoryを適切に注入していないと思いますか?

UniqueIdValidator.java:

package testapp.mis.validator;
import java.io.Serializable;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional; // Added in update 2


public class UniqueIdValidator implements ConstraintValidator<Unique, Serializable> {

@Autowired(required=true)
private SessionFactory sessionFactory;

private Class<?> entityClass;
private String uniqueField;

public void initialize(Unique unique) {
    entityClass = unique.entity();
    uniqueField = unique.property();
}

    @Transactional //Added in update 2 and validation works after that
public boolean isValid(Serializable property, ConstraintValidatorContext cvContext) {
    Criteria crit = sessionFactory.getCurrentSession().createCriteria(entityClass);
    crit.add(Restrictions.eq(uniqueField, property));
    return crit.list().isEmpty();
}

アップデート2 コードに@Transactionalを追加することで機能しました。

4

1 に答える 1

2

これはプレーンな HQL を使用します。次のような Criteria API を使用することで、より簡単なことを実現できます。

public boolean isValid(Serializable property, ConstraintValidatorContext cvContext) {
    Criteria crit = sessionFactory.getCurrentSession().createCriteria(entityClass);
    crit.add(Restrictions.eq(uniqueField, property));
    return crit.list().isEmpty();
}

それは一意性をチェックする必要があります。

hibernate テンプレートを注入する代わりに、Spring コンテキストで構成する必要がある SessionFactory を注入するだけです。

お役に立てば幸いです。

于 2012-05-03T17:55:28.470 に答える