У меня есть таблица пользователей и соответствующий 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
Сеанс должен быть инициализирован для того, чтобы построить кодек: определение UDT извлекаются из базы данных (потому что ваш сопоставленный класс может отображать только часть полей, поэтому, если мы построим определение с клиентской стороны, это может быть отсутствие полей). Кроме того, если вы не объявляете пространство ключей в аннотации '@ UDT', ему необходимо прочитать пространство ключей по умолчанию для сеанса. –