java - 使用 Cassandra 的 Datastax 实体映射器时如何使用继承?

标签 java inheritance cassandra datastax datastax-java-driver

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

我的问题是对象映射器似乎无法识别在父类(super class)中注释的字段。

我实现的结构是:

@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 字段,但这会非常难看(很多重复代码)。对如何为此类案例归档良好结构或最佳实践有什么想法吗?

最佳答案

更新:从版本 3.1.0 开始,驱动程序现在支持继承,如问题中所述。参见 Polymorphism Support section of the driver manual了解更多详情:

When mapping an entity class or a UDT class, the mapper will transparently scan superclasses and superinterfaces for annotations on fields and getter methods, thus enabling the polymorphic mapping of one class hierarchy into different CQL tables or UDTs.

Java 驱动程序 4.1.0+ 还将支持实体和 daos 的继承。

原答案:

很遗憾,目前您无法执行此操作。您需要创建两个具有重复结构的独立类。如果您想以通用方式处理两个实现的对象,您可以创建一个具有共享字段的接口(interface)。

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

关于java - 使用 Cassandra 的 Datastax 实体映射器时如何使用继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32949827/

相关文章:

java - 否定复杂的正则表达式

Java数组: how to insert delete items in array 1D and 2D

Django 条件模板继承

c++ - 重写构造函数 C++

cassandra - Astyanax 键范围查询

java - SoapUI SSLException

java - 将两个映射串联成一个java类

python - Python 继承的未知属性错误

java - 是否可以通过 datastax 驱动程序将 CQL 脚本提交到 cassandra 集群?

cassandra - 在 cassandra 中编写冲突解决方案