我使用的是Java 1.6和Hibernate 3.6.10.Final。我需要根据应用程序内置的枚举来检查几个数据库表的内容。 (数据库表往往会偶尔添加和删除值,没有人告诉开发人员。)所以on startup我想做这样的事情:
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!");
}
}
问题是,在第二行中,我不知道如何获得我正在查看的服务的相应枚举。有谁能建议一种方法?
答案 0 :(得分:1)
为所有服务类添加一个通用方法,其中每个服务都可以返回与其相关的枚举。
public Class<? extends Enum<?>> getEnumType() {
return MyEnum.class;
}
然后在您的代码中验证给定服务使用的枚举中的值的数量
myService.getEnumType().getEnumConstants().length;
答案 1 :(得分:0)
你可以这样做:
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!");
}
}
重要:强>
因为它发生了(我不会考虑&#34;记录消息告诉开发人员更新代码以支持新值&#34;问题的解决方案),我建议其他方法处理它:
enum
(see here)中的值,但不会处理对数据库的直接更改