2013-08-30 57 views
2

我最近一直在玩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環境設置正常。現在,問題:

  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,任何提示和建議都非常感謝!

Lu

回答

1

感謝關於PlayORM的好話。
幾件事:
1.你是如何得到你的u1對象的?我的意思是你正在使用哪種方法?
2.使用Playorm命令行工具,什麼結果你得到的查詢
「SELECT * FROM用戶」
OR
SELECT * FROM用戶其中id = 「U1」?

3.在TestOneToMany.java中有一個測試用例「testIndependentAddsAreCumulativeForCursor」。你的環境中運行良好嗎?如果運行良好,請分享您的完整代碼。

+0

嗯,它是這樣的救濟,事情的工作!你的測試套件可能不會反映這個問題,因爲默認情況下你使用延遲爲0ms的內存數據庫。但是,我在雲中使用了一個真正的Cassandra集羣,這個集羣可能會有數十毫秒的延遲。因此,訣竅就是不要立即檢索對象。順便說一句,所以它意味着mgr.flush()是暢通的? – user2732851

+0

作爲Dean在答案中提到的,你可以用Cassandra來運行你的測試。另外,不知道你的意思是什麼「flush()被解除封鎖」。請你詳細說明一下。 – Easility

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列。

謝謝, 院長

+0

謝謝Dean。我知道測試套件,我相信他們可能會運行良好,儘管我還沒有嘗試過。我正在編寫自己的示例代碼,因爲我覺得它可以幫助我更快地理解事物,當然,它與我現有的Cassandra知識很好地結合在一起。 我從你的反饋中學到的一件重要的事情就是光標不會將FK存儲在oringinal行中,這是PlayORM的一個設計特性。因此,我在Cassandra級別觀察到的情況都是正常的,我需要深入挖掘的唯一問題是爲什麼我沒有獲取對象引用 - 將在稍後發佈。 – user2732851

+0

很酷,聽起來不錯。運行測試套件是很好的,這樣你就可以比較你的代碼出了什麼問題;)。有時,當你有一個可以找到錯字的參考示例時,調試問題會更快;)。祝你好運。 –

相關問題