【问题标题】:Ignite CacheJdbcPojoStoreFactory using Enum fields使用枚举字段点燃 CacheJdbcPojoStoreFactory
【发布时间】:2017-01-16 16:29:53
【问题描述】:

我要使用 CacheJdbcPojoStoreFactory

我想在数据库中有一个 VARCHAR 字段映射到 Java 中的枚举。

我试图实现这一点的方式类似于以下内容。我希望应用程序代码与枚举一起工作,但要持久使用字符串,以便它在数据库中是人类可读的。我不想在数据库中使用 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() 它将为空。其他(直接映射的)列很好。

谢谢,

戈登

【问题讨论】:

    标签: ignite


    【解决方案1】:

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

    请尝试使用 OptimizedMarshaller:

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

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

    【讨论】:

    • CacheJdbcPojoStore 中对枚举映射的支持已合并到 master
    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2015-08-22
    • 1970-01-01
    相关资源
    最近更新 更多