Java 1.5: Лучшая практика, чтобы сохранить константы для имени столбца таблиц БД?

Технология: - Java 1.5 или 1.6 - Hibernate 3.4

Чтобы избежать обновления имени столбца в нескольких местах при изменении имени столбца или таблицы, я хочу иметь постоянный файл для того же.

У меня есть следующие запросы?

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

    class DbConstants
    {
            public static final String EMPLOYEE__PERFORMANCE_DESC="performance_desc";        
    } 
    

В приведенном выше случае сотрудники - это имя таблицы, а performance_desc - это имя столбца. Таким образом, для именования констант используется формат tablename__columnname, чтобы избежать коллизии между двумя константами двух разных таблиц, если у обеих есть имя столбца.

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

  • Предположим, если я изменил имя столбца в приведенном выше примере с performance_desc на достижений_desc. В этом случае очень вероятно, что я хотел бы также изменить константу, то есть с EMPLOYEE__PERFORMANCE_DESC на EMPLOYEE__ACHIEVEMENT_DESC. Поскольку в этом случае мне нужно было изменить как имя столбца, так и имя константы, я не вижу большого смысла использовать константу вместо имени столбца непосредственно в моем коде, хотя есть одно преимущество, что при изменении имени константы я могу использовать рефракцию для отражения константы имя изменить имя везде, где есть ссылки. Кажется, либо использование констант не слишком полезно, либо я использую их неправильно.

  • В коде проекта мне кажется, что люди определяют один класс для каждого списка столбцов таблицы, чтобы определить константы, как показано ниже.

    public class tbl_Employee
    {
            public static final PERFORMANCE_DESC=performance_desc;
    }    
    

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

  • Читайте где-нибудь о Enum со значением string, а не int, не уверен, что он доступен в Java 1.5 или 1.6 и целесообразно ли его использовать в данном сценарии.

  • Какова наилучшая практика для заданных констант БД?

  • Действительно ли полезно использовать константы БД?

  • Если я использую один класс для каждой таблицы, как упомянуто выше, я сталкиваюсь с проблемой именования. Каким должно быть отношение между именем таблицы и именем соответствующего класса, которые определяют константы для столбцов таблицы.

  • Выше случаев охватывает дело только для имен столбцов, а не имя таблицы. Мне может нравиться использовать константу, а не имя таблицы в коде, так что следует использовать для определения констант для имен таблиц.

  • Часто утверждается, что имя таблицы и имена столбцов не сильно меняются после выпуска продукта или соответствующей версии. Изменения в имени таблицы и имени столбца происходят в основном на этапе разработки или улучшения функции (новая версия). Это сильный аргумент, чтобы избежать использования констант для имен таблиц или столбцов?

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

5 ответов

Решение

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

Я обнаружил, что разумное количество таких констант делает код более читабельным. Я не думаю, что имена столбцов БД принадлежат примерно так, потому что

  • они не будут часто меняться, или, по крайней мере, они не должны быть

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

Я видел такие DB-файлы с тысячами констант, включая пользовательские запросы, части запросов и т. Д. И т. Д. public static final String COMMA=","; позаботиться о том, что написание запятых изменится в будущем). На этом этапе они превращаются в строки "использовать один раз", и никто не осмеливается их изменить.

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

Рассматривали ли вы использование Entity Mapping Framework (например, Hibernate)?

Он может хранить всю информацию таблицы базы данных (а также всю другую специфическую информацию БД) в файле конфигурации. Он также предлагает разделительный слой между "жестким" дизайном БД и вашим приложением (что облегчит восприятие изменений любым из них).

Вы можете создать интерфейс, который определяет константы.

Вот хороший пример в Android. Ищите DataColumns интерфейс.

В моем текущем проекте мы интенсивно используем аннотации для многих метаданных, связанных с БД, потому что мы не можем использовать такую ​​среду, как Hibernate. Для фактических констант столбцов, да, мы используем проверенный и истинный public static final String, И да, он довольно хрупкий.

Когда у меня есть метаданные о базе данных, я бы также сохранял их в базе данных. Вот как я видел, как работает другая система, если не изначально, то в конце концов. Чтобы обеспечить сохранение этих данных, вы можете проверить схему базы данных.

Другие вопросы по тегам