Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以编程方式在Java中获取对枚举的引用?_Java_Hibernate_Enums - Fatal编程技术网

如何以编程方式在Java中获取对枚举的引用?

如何以编程方式在Java中获取对枚举的引用?,java,hibernate,enums,Java,Hibernate,Enums,我正在使用Java1.6和Hibernate3.6.10.Final。我需要根据应用程序中内置的枚举检查几个数据库表的内容。(数据库表往往会偶尔添加或删除值,没有人告诉开发人员。)因此,我想这样做: for (service myService : ListOfServices() ) { enum MyEnum = GoGetCorrespondingEnum(myService); Map<Character, String> databaseMap = mySe

我正在使用Java1.6和Hibernate3.6.10.Final。我需要根据应用程序中内置的枚举检查几个数据库表的内容。(数据库表往往会偶尔添加或删除值,没有人告诉开发人员。)因此,我想这样做:

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!");
    }
}
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(服务myService:ListOfServices()){
enum MyEnum=gogetcorrespondingum(myService);
Map databaseMap=myService.findAll();
if(databaseMap.size()!=MyEnum.values().length){
logger.error(“枚举与数据库表不同步,必须修复!”);
}
}

问题是,在第二行中,我不知道如何为我正在查看的服务获取相应的枚举。有人能推荐一个方法吗?

为所有服务类添加一个通用方法,其中每个服务都可以返回与之相关的枚举

public Class<? extends Enum<?>> getEnumType() {
    return MyEnum.class;
}

你可以这样做:

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!");
    }
}
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;
}
private static final String[]SERVICE\u NAMES={“ServiceA”,“ServiceB”};
私人列表获取(服务)的对应值{
列表值=新的ArrayList();
for(字符串serviceName:SERVICE\u名称){
if(“ServiceA.equals(myService.class.name)){
for(EnumForServiceA值:EnumForServiceA.values()){
value.add(value.name());
}
打破
}
}
返回允许的值;
}
然后在您展示的代码中使用它(但您应该检查内容,而不仅仅是长度):

for(服务myService:ListOfServices()){
List supportedValues=GetCorrespondingValues for(myService);
以某种方式使用findAll()列出usedValues=getListOfUsedValues();/**/
如果(!supportedValues.containsAll(usedValues)){
logger.error(“枚举与数据库表不同步,必须修复!”);
}
}

重要提示:

既然发生了(并且我不认为“记录一条消息告诉开发人员更新代码以支持新的值”这个问题的解决方案),我会建议其他方法来处理它:

  • 限制用户仅在
    enum
    ()中添加值,但它不会处理对数据库的直接更改
  • 重新构造代码结构和/或数据映射以更好地处理这种情况,而不需要更改代码

依赖数据库记录存在的代码听起来有内在的问题,你能将其完全移出数据库吗?不幸的是,不能。数据库人员希望数据库中的信息用于报告目的,应用程序人员希望应用程序中的信息用于代码可读性目的。我被夹在这两个要求之间。我只是想防止应用程序对用户造成影响。