2016-01-11 88 views
3

我有一個用戶表和相應的POJO如何卡桑德拉UDT轉換爲可選類型

@Table 
public class User{ 
    @Column(name = "id") 
    private String id; 

    // lots of fields 

    @Column(name = "address") 
    @Frozen 
    private Optional<Address> address; 

    // getters and setters 
} 

@UDT 
public class Address { 
    @Field(name = "id") 
    private String id; 

    @Field(name = "country") 
    private String country; 

    @Field(name = "state") 
    private String state; 

    @Field(name = "district") 
    private String district; 

    @Field(name = "street") 
    private String street; 

    @Field(name = "city") 
    private String city; 

    @Field(name = "zip_code") 
    private String zipCode; 

    // getters and setters 
} 

我想轉換UDT「地址」來選購。因爲我使用「cassandra-driver-mapping:3.0.0-rc1」和「cassandra-driver-extras:3.0.0-rc1」,所以我可以使用很多編解碼器。

例如:OptionalCodec

我想註冊到CodecRegistry並通過TypeCodec到OptionalCodec的構造。

但TypeCodec是一個抽象類,我無法啓動它。

有人有任何想法如何啓動OptionalCodec?


謝謝@ Olivier Michallat。您的解決方案是好的!

但我有點困惑,將OptionalCodec設置爲CodecRegistry。 您必須先開始會話。 然後將會話傳遞給MappingManager,獲取正確的TypeCodec和註冊編解碼器。

爲了得到TypeCodec,你必須首先初始化session,這有點奇怪嗎?

Cluster cluster = Cluster.builder() 
         .addContactPoints("127.0.0.1") 
         .build(); 
Session session = cluster.connect(...); 
cluster.getConfiguration() 
     .getCodecRegistry() 
     .register(new OptionalCodec(new MappingManager(session).udtCodec(Address.class))) 
     .register(...); 
// use session to operate DB 
+0

該會話需要,以便建立所述編解碼器被初始化:在UDT定義從數據庫中檢索(因爲您的映射類只能映射部分字段,所以如果我們從客戶端構建定義,它可能會缺少字段)。另外,如果你不在'@ UDT'註釋中聲明一個keyspace,它需要讀取會話的默認密鑰空間。 –

回答

5

MappingManager具有將從註釋類創建編解碼器的方法:

TypeCodec<Address> addressCodec = mappingManager.udtCodec(Address.class); 
OptionalCodec<Address> optionalAddressCodec = new OptionalCodec(addressCodec); 
codecRegistry.register(optionalAddressCodec); 
+0

這是您可以找到的最優雅的解決方案之一。你爲我節省了很多時間!謝謝 – Riverside