3

User テーブルとそれに対応する POJO があります

@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 を開始する方法を知っている人はいますか?


ありがとう、@オリヴィエ・ミシャラ。あなたの解決策はOKです!

しかし、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
4

2 に答える 2

5

にはMappingManager、注釈付きクラスからコーデックを作成するメソッドがあります。

TypeCodec<Address> addressCodec = mappingManager.udtCodec(Address.class);
OptionalCodec<Address> optionalAddressCodec = new OptionalCodec(addressCodec);
codecRegistry.register(optionalAddressCodec);
于 2016-01-11T13:45:57.987 に答える