使用枚举字段

时间:2017-01-12 09:18:46

标签: ignite

我将使用CacheJdbcPojoStoreFactory

我想在数据库中有一个VARCHAR字段,该字段映射到Java中的Enum。

我试图实现这一点的方式类似于以下内容。我希望应用程序代码与enum一起使用,但持久性使用字符串,以便它在数据库中是人类可读的。我不想在数据库中使用int值。

这似乎适用于创建新对象,但不能用于读取它们。它似乎试图直接设置字段,并且不调用setter(setSideAsString)。当然没有名为sideAsString的字段。这有用吗?有什么建议吗?

以下是代码摘录 在某些应用程序代码中,我会执行类似

的操作
trade.setSide(OrderSide.Buy)

这将持续存在。我可以在侧栏中将“购买”视为VARCHAR。

在贸易中

private OrderSide side; // OrderSide is an enum with Buy,Sell
public OrderSide getSide() {
    return side;
}
public void setSide(OrderSide side) {
    this.side = side;
}
public String getSideAsString() {
    return this.side.name();
}
public void setSideAsString(String s) {
    this.side = OrderSide.valueOf(s);
}

现在配置商店时,我这样做

Collection<JdbcTypeField> vals = new ArrayList<>();
vals.add(new JdbcTypeField(Types.VARCHAR, "side", String.class, "sideAsString"));

干净启动后,如果我使用Ignite SQL查询查询Trade,并调用trade.getSide(),它将为null。其他(直接映射)列很好。

谢谢,

戈登

1 个答案:

答案 0 :(得分:1)

BinaryMarshaller仅反序列化查询中使用的字段。

请尝试使用OptimizedMarshaller:

IgniteConfiguration cfg = new IgniteConfiguration();  
...
cfg.setMarshaller(new OptimizedMarshaller());

这是the ticket,用于CacheJdbcPojoStore中的支持枚举映射。