使用Cursor在OneToMany上运行基本PlayORM示例时遇到问题

时间:2013-08-30 12:44:47

标签: playorm

我最近一直在玩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();
        ... ...
}

好的,方案简单明了,我的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()。

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

2 个答案:

答案 0 :(得分:1)

感谢有关PlayORM的好话 几件事:
1.你如何获得你的u1对象?我的意思是你使用哪种方法?
2.使用Playorm命令行工具,您获得的查询结果为什么 “select * from User”
OR
select * from User where id =“u1”?

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

答案 1 :(得分: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列。

感谢, 迪安