将Java对象映射到Cassandra数据存储的最佳方法是什么?

时间:2010-07-01 15:13:07

标签: java cassandra

我开始使用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;
}

0 个答案:

没有答案