1

由于 playorm 支持多对多,我有两个与此相关的问题:

  1. 在多对多的情况下,实体如何存储在数据库中。即,需要多少个表/列族。
  2. 此外,在 com.alvazan.test.db 包中给出的示例中,它在 Account.java 中使用:

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

    这里给出了一个类似的例子。我关心的是,我们是否总是需要使用 CursorToMany 来实现 ManyToMany?

    如果是,是否不会引起任何问题,因为 CursorToMany 不属于数据层(实体不会保留 POJO)。

    如果不是,那么反过来呢?

4

2 回答 2

1

您链接到的链接向您展示了多对多的 pojo 方式,但是使用 pojo 方法,如果您的列表中有太多,您可能会得到 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>();
}

对于任何 *ToMany(OneToMany, ManyToMany) 我们将外键列表存储在行本身中。在上面的示例中,只有两个表。一行看起来像这样

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,并且您的两个操作都会生效。如果您遵循后一种方法,则服务器的更改之一将丢失。

后来,迪恩

于 2012-10-19T14:17:43.010 回答
0

谢谢!我的注释:@NoSQLId 只接受字符串!由于KeyValidationClass = org.apache.cassandra.db.marshal.UTF8Type的默认 ColumnFamily ,
您将收到“Astyanax Key Validation Exception”的任何其他类型。

于 2012-10-30T13:08:54.213 回答