Datastax Cassandra - 使用对象映射器时的继承
问题描述:
我尝试使用Cassandra来保存相当简单的POJO,但使用类层次结构(许多子类,一个超类)。我正在使用Java和Datastax驱动程序(和对象映射器)。Datastax Cassandra - 使用对象映射器时的继承
我的问题是,对象映射器似乎无法识别在超类中注释的字段。
我实现的结构是:
@Table(keyspace = "...", name = "...")
public class Subclass extends Superclass {
public double x;
public double y;
public double z;
....
}
public class Superclass {
@PartitionKey(0)
@Column(name = "user_id")
public long userId;
@PartitionKey(1)
@Column(name = "device_id")
public long deviceId;
}
然后我试图保存子类对象:
public static void main(String[] args) {
Subclass data = new Subclass();
data.deviceId = 123;
data.userId = 1212;
data.x = 0;
data.y = 1;
data.z = 2;
Cluster cluster;
Session session;
...
Mapper<Subclass> mapper = new MappingManager(session).mapper(Subclass.class);
mapper.save(data);
}
此抛出:
com.datastax.driver.core.exceptions.InvalidQueryException: Missing mandatory PRIMARY KEY part user_id
有没有什么办法让它运行在这样的结构?一种解决方案是重新声明子类中的userId/deviceID字段,但这会非常难看(很多重复的代码)。任何想法如何为这样的案例归档良好的结构或最佳实践?
答
暂时不幸你不能这样做。您需要创建两个具有重复结构的独立类。如果你想以通用的方式解决两个实现的对象,你可以使用共享字段创建一个接口。
有一张票JAVA-541为此添加支持,如果您想在驱动程序中看到此功能,请投票。
谢谢你的回答。我提高了票价,并会发表评论,我会在驱动程序中显示“限制”班级(在我眼里)。基本上他们使用getDeclaredFields()而不是getFields() - 但GetDeclaredFields()仅为类提取注释,并且不包含超类注解。 – M156
只是测试了我的“修复”,它似乎工作(见票)。如果有人能证实这一点,将不胜感激 – M156
这是一个驱动程序中的重要功能。卡桑德拉表,非规范化,将有一个更大的对象结构每个插入。不能处理继承会阻碍符合ORM的对象。本质上,Cassandra驱动程序不能映射pojos,它只能映射ssjo(超级简单的java对象)。 – JohnC