2016-07-30 65 views
1

假设我有卡桑德拉称为“UserPrincipal” users表,该库将类似于以下如何更新春季CassandraRepository多个表

public interface UserRepository extends CassandraRepository<UserPrincipal> 
{ 
    @Query("SELECT * FROM UserPrincipal WHERE email = ?0") 
    UserPrincipal findByEmailAddress(String emailAddress); 
} 

如果我需要查询表的用户名,例如,我必须对表进行非规范化并创建一个副本,并将其称为UserPrincipalByUsername,它与第一个相同,并且只与主键不同,现在可以将以下接口用作存储库吗?那么为了保持数据的一致性,同时在两个表中保存/删除用户呢?

public interface UserRepository extends CassandraRepository<UserPrincipal> 
{ 
    @Query("SELECT * FROM UserPrincipal WHERE email = ?0") 
    UserPrincipal findByEmailAddress(String emailAddress); 

    @Query("SELECT * FROM UserPrincipalByUsername WHERE username= ?0") 
    UserPrincipal findByUsername(String username); 
} 

可以指出的是,两个独立的接口可用于单独处理每个表,不过,我需要有一些逻辑保持在某个点的一致性。

我使用卡桑德拉2.0.11,CQL规范3.1.1,春数据卡桑德拉1.3.2和Spring 1.3.1启动

+0

'UserPrincipal'和'UserPrincipalByUsername'是不同的表?用不同的主键?您可以在'UserPrincipal'上创建二级索引来使用名称进行查询,而不是对其进行反规范化处理? – Saravana

+0

实际上,您不能将cassandra索引用于高基数列,这是用户名的情况。 – Hasson

+0

使用'@ Query'可以满足您的需求。保持两个表同步是你的工作。您可以使用原子批处理操作,但这些操作非常昂贵,因为它们会使Cassandra节点处于繁忙状态。如何处理一些批量作业,并跟踪清理/添加缺失数据? – mp911de

回答

0

我发现要解决这一点,因为在问题中提到的唯一方法,要使用两个单独的接口来单独处理每个表,我添加了一个包装类,以便使用一个调用将它们两个都用于save,但这不能保证始终保持一致(例如,在服务器/系统故障的情况下),但这在我的特定应用程序中是可以的。