Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2012, 02:02   #1
Arazei
Пользователь
 
Аватар для Arazei
 
Регистрация: 16.08.2011
Сообщений: 24
По умолчанию Валидация поля на проверку существование в БД без учета регистра

Короче задача
Имя отдела должно быть уникально без учета регистра (т.е. Существование двух отделов с названиями “Бухгалтерия” и “БУХГАЛТЕРИЯ” невозможно)
Решил сделать с помощью анотации. Идея такова с view бередся строка name загоняется в класс в котром из базы пытается достаться эта же строка,для понимания(select * from Division where name ilike name) и если запрос не равен null то должна быть исключение типа такое имя уже есть и бла бла бла. Но чет не то. Класс который сравнивает не работает. В коде показано где именно. Кто в силах помочь?

класс домэин
Код:
@Entity
@FieldExistence(field="divisionname")
public class Division {
    
    @Id
    @GeneratedValue
    private long id;
    
    @NotBlank
    @Column(name = "divisionname", unique = true, nullable=false)
    private String divisionname;

    public String getDivisionname() {
        return divisionname;
    }

    public void setDivisionname(String divisionname) {
        this.divisionname = divisionname.trim();
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
}
клас проверяющий наличие в БД
Код:
public class FieldExistenceValidator implements ConstraintValidator <FieldExistence, Object>{
    private String field;
    private String checkfield;
    private String message = FieldExistence.MESSAGE;
    DivisionService divisionService;

    public void initialize(FieldExistence constraintAnnotation) {
        System.out.println("===initialize ");
        this.message = constraintAnnotation.message();
        this.field = constraintAnnotation.field();
        this.checkfield = new String();
    }

    public boolean isValid(Object value, ConstraintValidatorContext context) {
        System.out.println("===isValid ");
        try {
            System.out.println("===try ");
            System.out.println("field "+field);
                final Object fieldObject=getProperty(value, field, null);  
                System.out.println("===fieldObject "+fieldObject.toString());
                String f=fieldObject.toString();
                System.out.println("===f "+f);
                checkfield = divisionService.findDivisionByDivisionname(f.trim()).getDivisionname(); <---Вот после этого нечего ве что ниже не выполняется.
                System.out.println("===checkfield "+checkfield);
//                if (fieldObject==null && checkfield==null) {
//                    return true;
//                }
                System.out.println("===checkfield "+checkfield);
                System.out.println("===f "+f);
                boolean matches=(checkfield==null);

                if (!matches){
                    String msg=this.message;
                    if( this.message==null || "".equals(this.message) || FieldExistence.MESSAGE.equals( this.message ) )
                        {msg="Sorry but this record already exists";
                    }
                    context.disableDefaultConstraintViolation();
                    context.buildConstraintViolationWithTemplate(msg);
                }
                return matches;
        } 
        catch (final Exception e) {
                e.printStackTrace();
        }
        return true;
    }

    private Object getProperty(Object value, String fieldName, Object defaultValue){
        Class<?> clazz = value.getClass();
        String methodName="get"+Character.toUpperCase(fieldName.charAt(0))+fieldName.substring(1);
        try {
            Method method = clazz.getDeclaredMethod(methodName, new Class[0]);
            return method.invoke(value);
        } 
        catch (Exception e) {
        }
        return defaultValue;
    }
}
Жирным выделил место проблемы. Даже если кто не знает, но есть соображения. Прошу не стеснятся, любая мысль может подкинуть идею правельного решения.
Arazei вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск без учета регистра Alex2391 Общие вопросы Delphi 7 22.03.2011 08:39
Поиск без учета регистра MSD БД в Delphi 15 12.05.2010 15:49
Поиск без учета регистра Cartman18 БД в Delphi 2 15.10.2009 15:18
Lookup без учета регистра ИВАНьКа Общие вопросы C/C++ 1 30.08.2009 12:48
Проверка текста без учета регистра John_chek Общие вопросы Delphi 8 08.06.2007 08:50