我有一個用戶表和相應的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」,所以我可以使用很多編解碼器。
我想註冊到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
該會話需要,以便建立所述編解碼器被初始化:在UDT定義從數據庫中檢索(因爲您的映射類只能映射部分字段,所以如果我們從客戶端構建定義,它可能會缺少字段)。另外,如果你不在'@ UDT'註釋中聲明一個keyspace,它需要讀取會話的默認密鑰空間。 –