2014-01-06 6 views
0

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

Я всегда использую критерии Hibernate и следующий метод HibernateUtils.getPropertyName(), который я создал для этого.

/** 
* Get a Hibernate property name.<p> 
* 
* <b>NOTE:</b> This method assumes all property names start with a lower-case character. 
* 
* @param methodChecker 
*  - An ignored value. This parameter is a place-holder for a call to the "get" method for the property of interest. 
* @param methodName 
*  - The name of the "get" method used to retrieve the property of interest 
* @return The property name 
*/ 
public static String getPropertyName(Object methodChecker, String methodName) 
{ 
    String propertyName; 
    if (methodName.startsWith("get")) 
    { 
     propertyName = methodName.substring(3, 4).toLowerCase(Locale.ENGLISH) 
       + methodName.substring(4); 
    } 
    else if (methodName.startsWith("is")) 
    { 
     propertyName = methodName.substring(2, 3).toLowerCase(Locale.ENGLISH) 
       + methodName.substring(3); 
    } 
    else 
    { 
     throw new IllegalArgumentException("method name did not start with 'is' or 'get'"); 
    } 

    return propertyName; 
} 

Чтобы использовать его, я вызываю метод «получить» для свойства в качестве первого параметра, и я жестко закодировать имя этого метода «получить» для второго свойства.

Используя этот подход, конфигурации или базы данных изменений Hibernate приведет к Ошибки времени компиляции вместо ошибок во время выполнения.

Например, следующий код приведет к RUN-TIME ERROR если поставщик собственность была переименована Имя_вендора.

Продукт product = (Product) session.createCriteria (Product.class) .add (Property.forName («поставщик»). Eq (поставщик)). UniqueResult();

Чтобы исправить код, все вхождения поставщика должны быть заменены Имя_вендора. Очевидно, что это подвержено ошибкам и может быть очень трудоемким.

я достичь той же функциональности, используя следующую инструкцию:

продукт = (продукт) session.createCriteria (Product.class) .add (Property.forName (HibernateUtils.getPropertyName (myProduct.getVendor(), "getVendor")) экв (поставщик)) uniqueResult()..;

Второй подход приведет к во время компиляции ОШИБОК если поставщик свойство переименован Имя_вендора, так как метод getVendor() изменится на getVendorname().

Мне интересно, может ли быть другой подход - что-то, что позволило бы мне полностью исключить HibernateUtils.getPropertyName().

Спасибо!

+0

Большинство людей будут делать повторный фактор IDE в имени компонента, который с радостью исправит вызов метода без изменения строки, и вы никогда не увидите ошибки времени компиляции. Это похоже на работу для jUnit, не свернутый код, чтобы попытаться предотвратить будущие опечатки. – Affe

+0

dkatzel упоминает ту же проблему ниже. Это хороший момент. Я смог избежать этого, поставив точку использования классов Hibernate по мере их создания и никогда не рефакторинг с использованием среды IDE. Определенно что-то стоит отметить. Благодарю. – bigleftie

ответ

1

Я не думаю, что это хороший дизайн. Вы говорите, что вы не жестко кодируете имена свойств, но вы есть.

Прежде всего, вместо того, чтобы только жестко кодировать имя свойства один раз в вашей сущности, вместо этого вместо этого у вас есть жесткий код, который несколько раз увеличивает вероятность опечатки или еще одно место для исправления, если проект изменяется.

Я бы не стал беспокоиться о будущей проверке вашей конфигурации в случае изменения таблицы или столбца. У вас должны быть тесты на единицу и интеграцию (у вас действительно есть тесты?), Чтобы фактически проверить, что данные правильно прочитаны и загружены в вашу схему (в тестовой базе данных). Любое изменение - это схема базы данных - это огромное изменение, которое обязательно потребует нового обновления для вашего кода, поэтому маловероятно, что это произойдет случайно или без предупреждения.Наконец, если вы просто используете сопоставление свойств hibernate соответствующим образом, вам нужно обновить только одно место, когда/если имя столбца изменится.

Наконец, если вы хотите изменить имя метода в своих объектах, все хорошие IDE будут иметь поддержку рефакторинга для автоматического обновления всех мест, в которых используется этот метод. Это будет сложнее сделать, если вы просто передаете имена строк и используете имена Java Bean, чтобы выяснить, какой именно метод.

+0

Технически, я не являюсь категориальными именами свойств. Я намеренно жестко кодирую имя методов get для свойств. Это мой простой подход к тому, чтобы компилятор рассказывал мне, где и когда что-то прерывается автоматически. Ваша опечатка хорошая. Чтобы избежать этого, ** всегда ** вырезать и вставить второй параметр. Не могли бы вы рассказать о своем заявлении «если вы просто используете сопоставление свойств гибернации»? Это может быть то, что мне не хватает. Наконец, что касается вашего последнего абзаца, все мои классы Hibernate автоматически генерируются, и я никогда не изменяю их содержимое. – bigleftie

Смежные вопросы