我最近一直在玩PlayORM,並且發現它非常有趣和有用。因此,首先,非常感謝提供這一點。在OneToMany上使用光標運行基本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環境設置正常。現在,問題:
當我使用
List<Email> emails
,對於E1和E2外鍵被存儲爲U1的行中列 - 這正是預期的行爲。但是,當我找到u1對象時,u1.getEmails()
始終是一個空列表,其中沒有e1和e2,儘管它們實際上存在於db中。爲什麼?當我使用
CursorToMany<Email> emailCursor
代替時,e1和e2的外鍵永遠不會進入u1的行 - 這是不正常的,不是嗎?當然,在這種情況下,當我找到u1對象時,Cursor沒有next()。
順便說一句,我使用的是PlayORM-1.7-snapshot,任何提示和建議都非常感謝!
Lu
嗯,它是這樣的救濟,事情的工作!你的測試套件可能不會反映這個問題,因爲默認情況下你使用延遲爲0ms的內存數據庫。但是,我在雲中使用了一個真正的Cassandra集羣,這個集羣可能會有數十毫秒的延遲。因此,訣竅就是不要立即檢索對象。順便說一句,所以它意味着mgr.flush()是暢通的? – user2732851
作爲Dean在答案中提到的,你可以用Cassandra來運行你的測試。另外,不知道你的意思是什麼「flush()被解除封鎖」。請你詳細說明一下。 – Easility