2012-05-03 6 views
0

値が一意であることを検証するカスタム制約が必要です。私は良い例を見つけるためにインターネットを長い間探してきました。私が見つけたのは、もはや推奨されていない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を使用しています

答えて

2

は、あなたがクライテリアAPI、のようなものを使って、シンプルな何かを達成することができます。

休止状態のテンプレートを挿入するのではなく、Springコンテキストで構成したはずのSessionFactoryを挿入するだけです。

あなたはそれが便利だと思っています!

+0

大変ありがとうございました。変更されたコードを使用するとエラーが発生します。私はSessionFactoryを適切に注入していないと信じています。私は私の質問に新しいコードを追加しました。ありがとう – dlinx90

+0

@Transactionalを追加して作業しました。それは正しいことですか?もう一度ありがとう – dlinx90

+0

はい、それは正しいことでした、歓声! –

関連する問題