Я использую Java 1.6 и Hibernate 3.6.10.Final. Мне нужно проверить содержимое нескольких таблиц базы данных на enums, встроенные в наше приложение. (Таблицы базы данных, как правило, добавляют значения и иногда удаляются, и никто не говорит разработчикам.) Поэтому при запуске я хотел бы сделать что-то вроде этого:
for (service myService : ListOfServices() ) {
enum MyEnum = GoGetCorrespondingEnum(myService);
Map<Character, String> databaseMap = myService.findAll();
if (databaseMap.size() != MyEnum.values().length) {
logger.error("Enum is out of sync with database tableand must be fixed!");
}
}
Уловка, во второй строке, я не знаю, как получить соответствующее перечисление для службы, на которую я смотрю. Может ли кто-нибудь предложить метод?
Добавьте общий метод ко всем вашим классам услуг, где каждая служба может вернуть перечисление, с которым оно связано.
public Class<? extends Enum<?>> getEnumType() {
return MyEnum.class;
}
Затем в вашем коде, который проверяет количество значений в перечислении для данного использования службы
myService.getEnumType().getEnumConstants().length;
Вы могли бы сделать что-то вроде этого:
private static final String[] SERVICE_NAMES = { "ServiceA", "ServiceB" };
private List<String> getCorrespondingValuesFor(service) {
List<String> values = new ArrayList<String>();
for (String serviceName : SERVICE_NAMES) {
if ("ServiceA".equals(myService.class.name)) {
for (EnumForServiceA value : EnumForServiceA.values()) {
values.add(value.name());
}
break;
}
}
return allowedValues;
}
И затем используйте его в коде, который вы показали (но вы должны проверить содержимое, а не только длину):
for (Service myService : ListOfServices()) {
List<String> supportedValues = getCorrespondingValuesFor(myService);
List<String> usedValues = getListOfUsedValues(); /*using findAll() someway*/
if (!supportedValues.containsAll(usedValues)) {
logger.error("Enum is out of sync with database tableand must be fixed!");
}
}
Важный:
Поскольку это происходит (и я не считаю, что "протоколирование сообщения, в котором разработчикам сообщается об обновлении кода для поддержки новых значений", решение проблемы), я бы предложил другие способы его решения:
enum
(см. Здесь), но он не будет обрабатывать прямые изменения в базе данных