[英]Cassandra Java driver 3 EnumNameCodec
我正在从Cassandra 2.1迁移到v3,因此使用了新的Java Driver v3。 已对@Enumerated(EnumType.STRING)或ORDINAL进行了更改,这些更改已由驱动程序扩展模块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模型的文件不同,并且当我尝试在枚举或DAO文件中放置“ CodecRegistry.DEFAULT_INSTANCE.register(new EnumOrdinalCodec(myEnum.class))”时,我从IDE Eclipse中得到错误。
如果有人可以帮助我了解如何更改@Enumerated(EnumType.STRING)以使用EnumNameCodec,请先感谢。
看起来他们将枚举,编解码器和DAO模型放在同一文件中
这只是一个代码示例。 在实际的项目中,这3个代码块放置在不同的文件中
创建Cluster
对象时,可以注册一个编解码器注册表(使用new CodecRegistry
创建一个)。 此编解码器注册表将负责将非本地类型(例如Java枚举)转换为受支持的CQL Java类型。
例如,通过注册new EnumOrdinalCodec<Foo>(Foo.class)
,您可以在任何Java Bean中使用枚举Foo
(即使在list <Foo>之类的内部集合中),对象映射器也会自动检测到是否存在一个可将枚举转换为枚举的编解码器Foo
变成CQL整数
注册自定义编解码器的代码示例(取自驱动程序文档):
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);
为了避免在集群对象中注册所有编解码器并仅在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
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.