【问题标题】:How do I use inheritance when using the Datastax entity mapper for Cassandra?使用 Cassandra 的 Datastax 实体映射器时如何使用继承?
【发布时间】:2016-01-02 04:22:06
【问题描述】:

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

我的问题是对象映射器似乎无法识别超类中注释的字段。

我实现的结构是:

@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 inheritance cassandra datastax datastax-java-driver


    【解决方案1】:

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

    在映射实体类或 UDT 类时,映射器将透明地扫描超类和超接口以查找字段和 getter 方法的注释,从而将一个类层次结构多态映射到不同的 CQL 表或 UDT。

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

    原答案:

    很遗憾,您暂时不能这样做。您需要创建两个具有重复结构的单独类。如果您想以共同的方式处理两个实现的对象,您可以创建一个带有共享字段的接口。

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

    【讨论】:

    • 感谢您的回答。我投了票,并将发表评论,我将在其中显示司机的“限制”等级(在我眼中)。基本上他们使用 getDeclaredFields() 而不是 getFields() - 但 GetDeclaredFields() 只获取类的注释,不包括超类注释。
    • 刚刚测试了我的“修复”,它似乎工作(见票)。如果有人能证实这一点,将不胜感激。
    • 这是驱动程序中的一项重要功能。 Cassandra 表,被非规范化,每次插入都会有一个更大的对象结构。无法处理继承会阻碍符合 ORM 条件的对象。本质上,Cassandra驱动不能映射pojos,只能映射ssjo(超级简单的java对象)。
    • +JohnC 您能否将您的疑虑添加到上述问题中? (datastax-oss.atlassian.net/browse/JAVA-541)。这将使其更具可见性。
    猜你喜欢
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2015-08-02
    • 2021-11-22
    • 2020-11-23
    • 2022-12-11
    • 1970-01-01
    相关资源
    最近更新 更多