Datastax Mapper 不映射摘要中存在的字段 class

Datastax Mapper does not map fields present in abstract class

我正在使用 datastax cassandra 映射器和 read/write 数据到 cassandra 的访问器。

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

我有一些实体,这些实体具有我放在 Super class 中的公共字段。但问题是 datastax AnnotationParser 只做 entityClass.getDeclaredFields() 而不会处理 superclass 字段。因此,当我从数据库读取记录时,返回的实体并没有填充所有字段。

是否有任何可用的修复或解决方法?最后一个选项是摆脱超级 class 并将字段添加到单个实体 class。但我不想这样做,因为它违背了 OOPS 概念并且会使代码无法维护。

感谢任何帮助。 谢谢

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

作为解决方法,我创建了自定义 MappingManager 和 AnnotationParser class。我保留了与 Datastax 提供的 MappingManager.java 和 AnnotationParser.java 完全相同的代码。我所做的唯一更改是,在调用 getDeclaredFields() 的 AnnotationParser 中,我将其替换为以下调用。并在自定义映射管理器中使用了我自己的 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;
}

我在初始化映射管理器的代码中有一个点。

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

所以将来如果我们得到最新的 datastax 映射器并解决了这个问题,我们将不得不删除我们的两个 classes 并只更改一个地方的代码。

想到发布它,这样它可能会对某人有所帮助。