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为此添加支持,如果您想在驱动程序中看到此功能,请投票。

+0

谢谢你的回答。我提高了票价,并会发表评论,我会在驱动程序中显示“限制”班级(在我眼里)。基本上他们使用getDeclaredFields()而不是getFields() - 但GetDeclaredFields()仅为类提取注释,并且不包含超类注解。 – M156

+0

只是测试了我的“修复”,它似乎工作(见票)。如果有人能证实这一点,将不胜感激 – M156

+0

这是一个驱动程序中的重要功能。卡桑德拉表,非规范化,将有一个更大的对象结构每个插入。不能处理继承会阻碍符合ORM的对象。本质上,Cassandra驱动程序不能映射pojos,它只能映射ssjo(超级简单的java对象)。 – JohnC