2015-10-05 54 views
3

我嘗試使用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字段,但這會非常難看(很多重複的代碼)。任何想法如何爲這樣的案例歸檔良好的結構或最佳實踐?

回答

5

暫時不幸你不能這樣做。您需要創建兩個具有重複結構的獨立類。如果你想以通用的方式解決兩個實現的對象,你可以使用共享字段創建一個接口。

有一張票JAVA-541爲此添加支持,如果您想在驅動程序中看到此功能,請投票。

+0

謝謝你的回答。我提高了票價,並會發表評論,我會在驅動程序中顯示「限制」班級(在我眼裏)。基本上他們使用getDeclaredFields()而不是getFields() - 但GetDeclaredFields()僅爲類提取註釋,並且不包含超類註解。 – M156

+0

只是測試了我的「修復」,它似乎工作(見票)。如果有人能證實這一點,將不勝感激 – M156

+0

這是一個驅動程序中的重要功能。卡桑德拉表,非規範化,將有一個更大的對象結構每個插入。不能處理繼承會阻礙符合ORM的對象。本質上,Cassandra驅動程序不能映射pojos,它只能映射ssjo(超級簡單的java對象)。 – JohnC