我正在使用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概念,并且会使代码无法维护。
感谢任何帮助。 感谢。
答案 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());
}
因此,如果我们获得修复此问题的最新数据映射器,我们将不得不删除我们的两个类并仅在一个地方更改代码。
想发布它,所以它可能对某人有帮助。