2016-01-11 3 views
3

У меня есть таблица пользователей и соответствующий POJOКак конвертировать Cassandra 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-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!?

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', ему необходимо прочитать пространство ключей по умолчанию для сеанса. –

ответ

5

MappingManager есть метод, который будет создавать кодек из аннотированного класса:

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

Это одно из самых элегантных решений, которые вы можете найти. Ты спас меня так много времени! благодаря – Riverside

Смежные вопросы