【问题标题】:Datastax cassandra object mapper setting consistency and if not existsDatastax cassandra 对象映射器设置一致性,如果不存在
【发布时间】:2015-08-24 22:52:22
【问题描述】:
我创建了带有 @Table 注释的实体,它类似于我的 cassandra 表。我可以毫无问题地进行保存、获取和一切操作。
当我想做一些更令人兴奋的事情时,我的问题就出现了,比如设置一致性级别或者如果不存在则插入或类似的事情。基本上@Table 有注释选项,您可以在其中配置读写一致性,但是如果您使用 Spring 并通过配置文件进行设置呢?我真的很喜欢为这些东西进行外部配置。还有如果不存在怎么办保存?
我知道你可以得到saveQuery 或getQuery 作为Statement 并且你至少可以设置一致性但它看起来很难看,那么你必须获取结果集,映射并获取你的对象。
有两个问题:
- 是否有更好的方法来动态设置对象映射器操作的一致性级别,包括访问器和实体?
- 如果映射对象不存在怎么办?
【问题讨论】:
标签:
java
cassandra
datastax
datastax-java-driver
【解决方案1】:
我理解这是一个非常古老的问题。但是这里的一些答案已经过时了,因此我在这里添加我的答案。
使用驱动程序版本 4.x,您可以使用 @StatementAttributes 注释来设置每个映射器 dao 方法的一致性级别和其他语句属性。
@Dao
public interface ProductDao {
@Select
@StatementAttributes(consistencyLevel = "ONE", pageSize = 500)
Product findById(int productId);
}
【解决方案2】:
如果映射对象不存在怎么办?
您将需要使用访问器接口并在那里指定您的自定义查询。如果您只需要更新一小部分可以完美运行的字段。
如果您需要使用 IF NOT EXISTS 保存整个对象,可以使用两个步骤来完成:首先使用 IF NOT EXISTS 更新特定字段以从逻辑上说该行正在更新,然后将对象保存到该行使用 mapper.save 操作。这完全取决于它是否适合您的应用逻辑。
docs from cassandra
它可以被包装到使用 mapper.save/load 进行简单操作的你的 Dao 对象中。