2012-10-19 37 views
1

由於playorm支持多對多,我有兩個與此相關的問題:多對多在playorm

  1. 如何存儲在數據庫中的多對多的情況下,實體。即需要多少個表/列族。
  2. 另外,在com.alvazan.test.db包給出的實施例,這是被在Account.java使用:

    @NoSqlManyToMany 
    private CursorToMany<Activity> activitiesCursor = new CursorToManyImpl<Activity>(); 
    

    一個類似的例子中給出here。 我的問題在於,我們是否總是需要使用CursorToMany來實現ManyToMany?

    如果是,是否不會引起任何問題,因爲CursorToMany不屬於數據層(實體不會保持POJO)。

    如果否,那麼反過來是什麼?

回答

1

您鏈接到顯示你很多的POJO的方式很多,但與POJO方法,如果您的列表中有許多tooooo這就是爲什麼我們還爲您提供光標,你可以得到OutOfMemoryExceptions鏈接。讓我們改變你給我的鏈接例子下列....

public class Student { 
    @NoSqlId 
    private String id; 
    private String firstName; 
    private String lastName; 
    @ManyToMany 
    private List<Course> courses = new ArrayList(); //constructing avoids nullpointers 
} 

public class Course { 
    @NoSqlId 
    private String id; 
    private String name; 
    private String description 
    @ManyToOne 
    private Lecturer lecturer; 
    @ManyToMany 
    private List<Student> students = new List<Student>(); 
} 

對於任何*一對多(一對多,多對多),我們存儲行自身的外鍵的列表。在上面的例子中,只有兩個表。一個行會看起來像這樣

studentrowkey -> firstName="dean", lastName="hiller", courses:courseFk56=null, courses:courseFk78=null, courses:courseFk98=null, etc. etc. 

注意我們沒有這樣說

studentrowkey -> firstName="dean", lastName="hiller", courses=courseFk56,courseFk78, courseFk98 

我們使用前者的原因是列操作是獨立的,所以如果兩個服務器在同一個學生讀...一臺服務器可能會添加courseFk200,另一臺可能會從學生中刪除courseFk56,並且您的兩個操作都會生效。如果您遵循後一種方法,則服務器的某個更改將會丟失。

後, 院長

0

謝謝!我的筆記:@NoSQLId只接受字符串!
任何其他類型,您將收到「Astyanax重點驗證異常」,因爲默認的ColumnFamily與KeyValidationClass = org.apache.cassandra.db.marshal.UTF8Type

+0

要回答他,你應該給他的回答添加評論,而不是新的回答 – mvallebr