我开始使用Cassandra,并且一直在使用Hector Java库,这个库目前似乎是最受欢迎的。
我正在试图弄清楚如何最好地将数据存储暴露给我的Java代码,并尝试做类似于我熟悉的使用关系数据存储时使用的对象关系模型。< / p>
这是表示用户的示例对象。是的,它是不可变的,我将分别处理这些对象的变异。
请注意,我创建了一个名为Database的独立类,它封装了CassandraClientPool。 execWithKeyspace方法采用(Google Collections)函数并将Hector Keyspace传递给它。我这样做是因为它允许我保证一旦我们完成它就将CassandraClient返回到池中。
尽管如此,我真的不确定我是否采取了最佳方法,并希望得到一些反馈:
public class User {
static final List<byte[]> colnames = Lists.newArrayList("Email".getBytes(), "Password-Hash".getBytes(),
"Name".getBytes(), "Company-Name".getBytes());
public static User getUser(final long id, final Database db) {
return db.execWithKeyspace(new Function<Keyspace, User>() {
@Override
public User apply(final Keyspace keyspace) {
final SlicePredicate sp = new SlicePredicate();
sp.setColumn_names(colnames);
final ColumnParent cp = new ColumnParent("Users");
final KeyRange kr = new KeyRange();
kr.setCount(1);
kr.setStart_key(Long.toString(id));
final Map<String, List<Column>> rangeSlices = keyspace.getRangeSlices(cp, sp, kr);
if (rangeSlices.size() != 1)
return null;
final List<Column> cols = rangeSlices.get(Long.toString(id));
if (cols == null)
return null;
return new User(id, string(cols.get(0).value), string(cols.get(1).value), string(cols.get(2).value),
string(cols.get(3).value));
}
});
}
final long id;
public final String email;
public final String passwordHash;
public final String name;
public final String companyName;
}