Я не использую жестко закодированные имена свойств 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().
Спасибо!
Большинство людей будут делать повторный фактор IDE в имени компонента, который с радостью исправит вызов метода без изменения строки, и вы никогда не увидите ошибки времени компиляции. Это похоже на работу для jUnit, не свернутый код, чтобы попытаться предотвратить будущие опечатки. – Affe
dkatzel упоминает ту же проблему ниже. Это хороший момент. Я смог избежать этого, поставив точку использования классов Hibernate по мере их создания и никогда не рефакторинг с использованием среды IDE. Определенно что-то стоит отметить. Благодарю. – bigleftie