値が一意であることを検証するカスタム制約が必要です。私は良い例を見つけるためにインターネットを長い間探してきました。私が見つけたのは、もはや推奨されていないhibernateテンプレートを使用しているので、テンプレートを使用しないように誰かがこのコードを "翻訳"する専門知識を持っているのだろうかと思っていました。私は自分でそれをやろうとしましたが、ゲッターとセッターが何をするのか分かりません。ここで私はあなたの助けをありがとうHibernateテンプレート変換
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);
}
}
this helpful guide.から得たコードがあります。私はこのエラーを取得していたコードを変更した後
/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を追加することにより、作業ました。
public boolean isValid(Serializable property, ConstraintValidatorContext cvContext) {
Criteria crit = sessionFactory.getCurrentSession().createCriteria(entityClass);
crit.add(Restrictions.eq(uniqueField, property));
return crit.list().isEmpty();
}
一意性を確認する必要があります:プレーンHQLを使用しています
大変ありがとうございました。変更されたコードを使用するとエラーが発生します。私はSessionFactoryを適切に注入していないと信じています。私は私の質問に新しいコードを追加しました。ありがとう – dlinx90
@Transactionalを追加して作業しました。それは正しいことですか?もう一度ありがとう – dlinx90
はい、それは正しいことでした、歓声! –