2

我最近一直在玩 PlayORM,发现它非常有趣和有用。因此,首先,非常感谢提供这个。

但是,我在运行一个非常基本的关于 OneToMany 关系的示例时确实遇到了一些麻烦,并且可能支持 Cursor。简而言之,我有三个简单的类:电子邮件、用户和测试,如下所示。

@NoSqlEntity
public class Email {
    @NoSqlId
    private String id;

    //getters and setters
    ... ...
}

@NoSqlEntity
@NoSqlQueries({ ... })
public class User {        
    @NoSqlId
    private String id;
    @NoSqlIndexed
    private String name;
    @NoSqlIndexed
    private int age;

    @NoSqlOneToMany
    private List<Email> emails = new ArrayList<Email>();
    //@NoSqlOneToMany
    //private CursorToMany<Email> emailCursor = new CursorToManyImpl<Email>();

    //getters and setters
    ... ...

    public void addEmail(Email e) {
        emails.add(e);
        //emailCursor.addElement(e);
    }
}

public class Test {
    private static NoSqlEntityManager mgr;
    public static void main(String[] args) {
        Map properties = new HashMap();
        properties.put(Bootstrap.AUTO_CREATE_KEY, "create");
        String clusterName = ...
        String seeds = ...
        String keyspace = ...
        Bootstrap.createAndAddBestCassandraConfiguration(properties, clusterName, keyspace, seeds);
        NoSqlEntityManagerFactory factory = Bootstrap.create(DbTypeEnum.CASSANDRA, properties, null, null);
        mgr = factory.createEntityManager();

        Email e1 = new Email();
        Email e2 = new Email();
        mgr.put(e1);
        mgr.put(e2);

        User u1 = new User();
        u1.setName...
        u1.setAge...
        u1.addEmail(e1);
        u1.addEmail(e2);
        mgr.put(u1);
        mgr.flush();
        ... ...
}

OK,场景简单明了,我的 Cassandra 1.2 环境搭建好了。现在,问题:

  1. 当我使用List<Email> emails时,e1 和 e2 的外键存储为 u1 行中的列 - 这正是预期的行为。但是,当我找到 u1 对象时,u1.getEmails()它始终是一个空列表,其中没有 e1 和 e2,尽管它们实际上在 db 中。为什么?

  2. 当我CursorToMany<Email> emailCursor改为使用时,e1 和 e2 的外键永远不会进入 u1 的行 - 这是不正常的,不是吗?当然,在这种情况下,当我找到 u1 对象时,Cursor 没有 next()。

顺便说一句,我正在使用 PlayORM-1.7-snapshot,非常感谢任何提示和建议!

4

2 回答 2

1

感谢您对 PlayORM 的好评。
几件事:
1. 你是如何得到你的 u1 对象的?我的意思是您使用的是哪种方法?
2. 使用 Playorm 命令行工具,查询
“select * from User”

select * from User where id = “u1”得到什么结果?

3.TestOneToMany.java中有一个测试用例“testIndependentAddsAreCumulativeForCursor”。这在您的环境中运行良好吗?如果运行良好,请分享您的完整代码。

于 2013-09-01T18:36:34.073 回答
1

如果使用 PlayOrm,您可以做的一件事是运行整个测试套件并在那里运行(检查整个项目并在 Eclipse 中右键单击 com.alvazan.test 并运行所有测试)...... .注意:将 FactorySingleton.java 从 IN_MEMORY 更改为 CASSANDRA 以针对本地 cassandra 运行。

完成后,您可以查看 TestOneToMany.java ,它完成了您正在谈论的整个示例,并且所有测试都通过了。如果有任何失败,请告诉我们。

在 CursorToMany 上,这是一种特殊情况,开发人员不想在同一行中存储与电子邮件的潜在 100,000 或 1,000,000 个关系,因为读取会导致一直读取所有 100 万个外键。相反,CursorToMany 将它扔到索引行中。这允许一次读取成批的关系。我们的项目中有一个实体使用它,因为它与 80,000 个其他实体相关,并且我们不希望每次读取一个实体时都读取 80,000 列。

谢谢,院长

于 2013-09-01T23:50:07.297 回答