Cassandra Java驱动程序3 EnumNameCodec

prdp8dxp  于 8个月前  发布在  Cassandra
关注(0)|答案(4)|浏览(77)

我正在从Cassandra 2.1迁移到v3,因此使用新的Java Driver v3。已对@Enumerated(EnumType.STRING)或ORDINAL进行了更改,该更改已被driver-extras模块EnumOrdinalCodec和EnumNameCodec交换。
在我的项目中,我有:

@Column(name = "myColumn")
    @Enumerated(EnumType.STRING)
    private myEnum         currentMyEnum         ;

我查找了一些关于如何使用它们的例子,但并不真正理解它们是如何工作的。我发现的主要信息是这个例子:

enum Foo {...}
enum Bar {...}

// register the appropriate codecs
CodecRegistry.DEFAULT_INSTANCE
    .register(new EnumOrdinalCodec<Foo>(Foo.class))
    .register(new EnumNameCodec<Bar>(Bar.class))

// the following mappings are handled out-of-the-box
@Table
public class MyPojo {
    private Foo foo;
    private List<Bar> bars;
    ...
}

我不太清楚。看起来他们把枚举,编解码器和DAO模型放在同一个文件中。在我的项目中,枚举和DAO模型在不同的文件中,当我试图将“CodecRegistry.DEFAULT_BAUNAT.register(new EnumOrdinalCodec(myEnum.class))”放入枚举或DAO文件时,我从IDE Eclipse中得到错误。
如果有人可以帮助我关于如何chnage @Enumerated(EnumType.STRING)使用EnumNameCodec提前感谢。

mxg2im7a

mxg2im7a1#

看起来他们把枚举,编解码器和DAO模型放在同一个文件中
这只是一个代码示例。在一个真实的项目中,这3个代码块放在不同的文件中
创建Cluster对象时,可以注册一个编解码器注册表(使用new CodecRegistry创建一个)。这个编解码器注册表将负责将非原生类型(如Java枚举)转换为支持的CQL Java类型。
例如,通过注册new EnumOrdinalCodec<Foo>(Foo.class),您可以在任何Javabean中使用enum Foo(甚至在列表这样的集合中),对象Map器将自动检测是否存在将enum Foo转换为CQL整数的编解码器

gwbalxhn

gwbalxhn2#

注册自定义编解码器的代码示例(摘自驱动程序文档):

Cluster cluster = Cluster.builder()..... ;  //Create the cluster singleton somewhere

// Create the enum codec
EnumOrdinalCodec<Foo> myEnumCodec = new EnumOrdinalCodec<Foo>(Foo.class)

// Retrieve the codec registry from the cluster configuration
// IF you didn't configure any codec registry, a default empty codec registry
// will be returned
CodecRegistry myCodecRegistry = cluster.getConfiguration().getCodecRegistry();

// Register your codec here
myCodecRegistry.register(myEnumCodec);
wlwcrazw

wlwcrazw3#

为了避免在集群对象中注册所有的编解码器,并将它们的使用仅本地化到DAO模型中,我建议使用以下方法(Kotlin):

class MyEnumCodec: EnumNameCodec<MyEnum>(MyEnum::class.java)

data class MyData(

    @ClusteringColumn(0)
    var id: String,

    @Column(name = "my_enum", codec = MyEnumCodec::class)
    var myEnum: MyEnum? = null
)
fv2wmkja

fv2wmkja4#

我已经在quarkus应用程序中注册了enum EnumNameCodec的类型编解码器:

@ApplicationScoped
public class AppLifecycleBeanCodecRegistration {

  @Inject
  CqlSession session;

  // to check db before start (CassandraClientStarter) - quarkus.cassandra.init.eager-init=true
  void onStart(@Observes @Priority(Priorities.AUTHORIZATION - 10) StartupEvent ev) {
    TypeCodec<User.Role> myEnumCodec = new EnumNameCodec<>(User.Role.class);

    MutableCodecRegistry registry = (MutableCodecRegistry) session.getContext().getCodecRegistry();
    registry.register(myEnumCodec);
  }
}

相关问题