1

我正在爲春季的Cassandra建立一個DAO。在Cassandra的春季數據中使用複雜的數據結構

現在我有一個關於在一個對象中多次使用複合類的問題。

我有這個類設置:

@Table(value = "settings") 
public class Setting { 

    @PrimaryKey 
    private User owner; 

    @Column("key") 
    private String key; 

    @Column("value") 
    private String value; 

    @Column("updated_by") 
    private User updatedBy; 
} 

和類用戶:

@PrimaryKeyClass 
public class User implements Serializable{ 

    @PrimaryKeyColumn(name = "userId", ordinal = 0, type = PrimaryKeyType.PARTITIONED) 
    private String id; 

    @PrimaryKeyColumn(name = "userIdType", ordinal = 1, type = PrimaryKeyType.PARTITIONED) 
    private String idType; 
} 

所以我使用了類用戶的兩倍。一次作爲主要關鍵「所有者」,一次作爲「updatedBy」。

在CassandraOperations類中使用它時,它可以很好地作爲主鍵,但不能再作爲另一列。

它抱怨已經在使用的列名稱userId。說得通。 那麼我該如何做這項工作?

我可以使用UserDefined Types?

CREATE TYPE test_keyspace.user (
    id text, 
    id_type text 
); 

但是我怎樣才能做到這一點從Java註釋?

或者,我該如何重複使用同一個類呢? 考慮到Cassandra中相對簡單的數據結構,我可以將User類展平爲一個單獨的字符串,如idType.id

感謝您的幫助!

回答

3

好的,發現它here,通過回答denzal

我的類現在看起來像:

@Table("settings") 
public class Setting { 

    @PrimaryKeyColumn(name = "owner", ordinal = 0, type = PrimaryKeyType.PARTITIONED) 
    @CassandraType(type = DataType.Name.UDT, userTypeName = "user_type") 
    private User owner; 

    @PrimaryKeyColumn(name = "key", ordinal = 1, type = PrimaryKeyType.CLUSTERED) 
    @CassandraType(type = DataType.Name.TEXT) 
    private String key; 

    @CassandraType(type = DataType.Name.TEXT) 
    private String value; 

    @CassandraType(type = DataType.Name.UDT, userTypeName = "user_type") 
    private User lastUpdatedBy; 
} 

和用戶等級:

@UserDefinedType("user_type") 
public class User implements Serializable{ 

    @CassandraType(type = DataType.Name.TEXT) 
    private String id; 

    @CassandraType(type = DataType.Name.TEXT) 
    private IdType idType; 

} 

很好地工作。

+0

雖然也需要TypeCodec。 [此處爲示例](http://docs.datastax.com/en/developer/java-driver/3.1/manual/custom_codecs/) – Denno