我正在从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模型放在同一个文件中。在我的项目中,enum和DAO模型在文件中是不同的,当我尝试将“CodecRegistry.DEFAULT_INSTANCE.register(new EnumOrdinalCodec(myEnum.class))”放入etheir enum或DAO文件时,我从IDE Eclipse中收到错误。
如果有人可以帮助我如何更改@Enumerated(Enum Type.STRING)以提前使用Enum Name Codec。
看起来他们将枚举,编解码器和DAO模型放在同一个文件中
这只是一个代码示例。在一个真实的项目中,这3个代码块被放在不同的文件中
创建Cluster
对象时,可以注册编解码器注册表(使用new CodecRegistry
创建一个)。此编解码器注册表将负责将非本机类型(如Java枚举)转换为支持的CQL Java类型。
例如,通过注册new EnumOrdinalCodec<Foo>(Foo.class)
,您可以在任何Java bean中使用枚举Foo
(甚至可以在列表中使用列表
并且对象映射器将自动检测是否存在用于转换枚举的编解码器
Foo
成为CQL整数
注册自定义编解码器的代码示例(取自驱动程序doc):
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
)