Как создать регистронезависимое поле на Java POJO. Ищете хороший дизайн. - PullRequest
0 голосов
/ 22 декабря 2010

Поэтому я использую GigaSpaces XAP с плагином Hibernate для загрузки моей таблицы БД в их кеш сетки, к сожалению, для запросов к сетке они не поддерживают прямой поиск без учета регистра.

Они предложили 2 решения:
1- использовать медленный запрос LIKE (такой же, как SQL) (даже не беспокоиться об этом)
2- создать отдельное свойство полей, которые я хочу, чтобы регистр не учитывался.

Так что теперь мойВарианты выбора:
1- Создать дополнительный столбец в БД, чтобы иметь поле без учета регистра (Не в этом времени жизни)
2- Создать пользовательский плагин загрузчика данных для XAP, чтобы в момент загрузки данных полехранится в свойстве «ToLower».(Поддерживается, но останется в крайнем случае)

Я определенно не пойду с # 1, и в качестве последнего результата я оставлю пользовательский загрузчик данных.Так что моя идея состоит в том, чтобы ...

class Person {
    String firstName
    String firstNameLower

    public void setFirstName(String firstName) {
        this.firstName = firstName

        this.firstNameLower = firstName.toLowerCase(...);
    }
}

Будет ли это работать с Hibernate?Поскольку загрузчик данных GigaSpace использует Hibernate, мой pojo в значительной степени является классом Entity.Я использую отображение Hibernate XML, а не аннотации.Поля «ToLower» не будут отображены.Вызывает ли Hibernate setXXX () для всех отображаемых полей или выполняет какую-то причудливую замену кода под капотом и не вызывает методы setXXX ().

Я также думаю, что аннотация будет хорошейиспользуйте здесь, но не знаете, как их реализовать или даже если это возможно для этого случая.

Ответы [ 3 ]

1 голос
/ 22 декабря 2010

hibernate действительно использует прокси-объекты, но данные по-прежнему хранятся в вашем объекте, и hibernate будет использовать предоставляемые реализации getter / setter, поэтому ваше решение должно работать, если вы хотите установить строчную версию, хотя я не яснопочему вам нужна отдельная переменная экземпляра для хранения строчной версии.

В этой статье рассматриваются основы прокси.

1 голос
/ 18 января 2011

Для всех, кто заинтересован.

Просто создайте метод поля «tolower ()» и добавьте к нему аннотацию индекса, и вы сможете отобразить свое pojo в спящий режим обычным способом.

0 голосов
/ 22 декабря 2010

Если вы сконфигурируете Hibernate для использования метода доступа к полям (а не для прямого доступа к полям), его поведение по умолчанию - использовать весь метод setXXX ().

Я думаю, что в вашем случае лучшим решением будет(если Hibernate используется только для GigaSpace), чтобы настроить способ загрузки данных Hibernate, определив пользовательский тип с помощью standrd StringType для загрузки данных, затем преобразовав его в нижний регистр ...

Между тем, если ваша систематребуются данные в нижнем регистре, не можете ли вы убедиться, что все строки, введенные в базу данных, являются строчными?

...