Datastax Cassandra - 使用对象映射器时的继承

时间:2015-10-05 13:26:56

标签: java inheritance cassandra datastax datastax-java-driver

我尝试使用Cassandra来持久化非常简单的POJO,但是使用类层次结构(许多子类,一个超类)。我正在使用Java和Datastax驱动程序(以及对象映射器)。

我的问题是,Object Mapper似乎无法识别超类中注释的字段。

我实施的结构是:

@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字段,但这将是非常难看的(很多重复的代码)。有关如何为这样的案例存档良好结构或最佳实践的任何想法吗?

1 个答案:

答案 0 :(得分:6)

暂时不幸你不能这样做。您需要创建两个具有重复结构的独立类。如果要以通用方式处理两个实现的对象,可以使用共享字段创建接口。

有一个机票JAVA-541用于添加对此的支持,如果您希望在驱动程序中看到此功能,请投票。