Datastax Mapper不映射抽象类中的字段

时间:2015-08-20 11:25:46

标签: datastax datastax-java-driver

我正在使用datastax cassandra mapper和accessor来读取/写入cassandra数据。

      <dependency>
       <groupId>com.datastax.cassandra</groupId>
       <artifactId>cassandra-driver-mapping</artifactId>
       <version>2.1.5</version>
      </dependency>

我有一些实体,这些实体有我在Super Class中放入的常用字段。但问题是datastax AnnotationParser只是执行entityClass.getDeclaredFields()并且不处理超类字段。因此,当我从DB读取记录时,返回的实体没有填充所有字段。

是否有针对此的修复或解决方法?最后一个选项是删除超类并将字段添加到单个实体类。但我不想这样做,因为它反对OOPS概念,并且会使代码无法维护。

感谢任何帮助。 感谢。

1 个答案:

答案 0 :(得分:0)

Datastax Mapper的已知问题。 https://datastax-oss.atlassian.net/browse/JAVA-541

作为一种解决方法,我创建了自定义MappingManager和AnnotationParser类。我保持代码与Datastax提供的MappingManager.java和AnnotationParser.java完全相同。我做的唯一改变是,在AnnotationParser中,无论getDeclaredFields()被调用,我都用以下调用替换它。并在自定义Mapping Manager中使用了我自己的AnnotationParser。

  public static ArrayList<Field> getAllFields(Class clazz) {
return getAllFieldsRec(clazz, new ArrayList<Field>());
}

private static ArrayList<Field> getAllFieldsRec(Class clazz, ArrayList<Field> fields) {
Class superClazz = clazz.getSuperclass();
if (superClazz != null) {
  getAllFieldsRec(superClazz, fields);
}
fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
return fields;
}

我在代码中有一个单点,其中初始化了Mapping Manager。

protected MappingManager getMappingManager() {
return new CustomMappingManager(getSession());
}

因此,如果我们获得修复此问题的最新数据映射器,我们将不得不删除我们的两个类并仅在一个地方更改代码。

想发布它,所以它可能对某人有帮助。