2014-11-04 88 views
1

我在卡桑德拉2.1中使用Cassandra Object Mapping API。在API,它看起來像一排的UPDATE進行做這些步驟:Cassandra對象映射API目前不支持更新嗎?

  1. 獲取對象(Mapper.get)
  2. 變化要更新
  3. 保存對象的字段( Mapper.save)

其轉換爲一個SELECT後跟一個INSERT。現在的CQL3.1 UPDATE語句在Cassandra對象映射API的稍後階段是否支持部分更新?我想避免最初的閱讀。

回答

2
  1. 您可以使用Accessor來編碼更新。

  2. 透明save VS update要麼會是使用代理和外地攔截器(複雜IMPL)規定,或導致實際上隱藏讀之前節省反模式。

使用訪問器應該爲您提供所需的一切,而無需使映射模塊在幕後執行魔術。

這個主題已經在這裏討論:https://datastax-oss.atlassian.net/plugins/servlet/mobile#issue/JAVA-474

+0

感謝亞歷克斯,我都會看着那吉拉,看看你們拿出。我猜「Accessor」與編寫自己的CQL語句幾乎相同(這非常靈活)。 'Accessor'語法的一個問題是你靜態定義要更新的列是否正確?例如:'@Query(「UPDATE users SET first_name =:first,last_name =:last WHERE id =:id」)'我總是需要同時更新'first'和'last',據我瞭解。 – reikje 2014-11-05 08:47:03

0

試試這個映射 https://github.com/valchkou/cassandra-driver-mapping

它支持局部更新,包括集合

mapper.updateValue(id, Entity.class, propertyName, value); 

/** Append value to the Set, List or Map. */ 
append(id, Entity.class, propertyName, value); 

https://github.com/valchkou/cassandra-driver-mapping#write

而且它具有自動模式同步功能(和更少的功能)在數據傳輸中漏掉了映射器

用法示例:

Entity entity = new Entity(); 
mappingSession.save(entity); 
entity = mappingSession.get(Entity.class, id); 
mappingSession.delete(entity); 

Maven的中央可供選擇:

<dependency> 
    <groupId>com.valchkou.datastax</groupId> 
    <artifactId>cassandra-driver-mapping</artifactId>   
</dependency>