如何借助实体映射器在Cassandra列中写入节点生成的当前时间戳
如何通过Cassandra实体映射器让字段使用
totimestamp(now())生成时间戳 我们通过实体映射器将Cassandra表映射为Java对象,实体类如下:
class Activity { @PrimaryKey int id; @Column Date modifiedDate; @Column String activityDesc; }
希望modifiedDate字段由Cassandra节点通过totimestamp(now())函数生成当前时间戳,且不想使用纯CQL插入语句,仅通过映射器方法实现。已知@Computed注解仅支持查询操作,无法用于插入场景。
下面是几种可行的解决方法:
自定义映射器插入方法
在你的映射器接口里定义带@Query注解的保存方法,既保留实体映射的便捷性,又指定modifiedDate用Cassandra函数生成:@Mapper public interface ActivityMapper { @Query("INSERT INTO activity (id, modifiedDate, activityDesc) VALUES (:id, totimestamp(now()), :activityDesc)") void save(Activity activity); }调用这个方法时,映射器会自动把
Activity对象的id和activityDesc字段值填入语句,同时让Cassandra生成时间戳。给Cassandra表字段设置默认值(推荐)
直接在Cassandra表结构中给modifiedDate设置默认值:ALTER TABLE activity ALTER modifiedDate SET DEFAULT totimestamp(now());之后插入数据时,把Java实体的
modifiedDate设为null,映射器会自动跳过这个字段,Cassandra会用默认值自动填充。如果需要更新时也刷新时间戳,同样可以在更新方法的自定义查询里指定modifiedDate = totimestamp(now())。不推荐:客户端生成时间
有些ORM框架支持实体生命周期监听器,能在插入前给字段赋值,但这是在客户端生成时间,不符合你要Cassandra节点生成的需求,所以不建议用。
内容的提问来源于stack exchange,提问作者Deepu--Java
相关产品推荐
相关产品推荐

