很多人在玩耍

时间:2012-10-19 13:28:20

标签: playorm

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

  1. 如果是ManyToMany,实体如何存储在数据库中。即,需要多少表/列系列。
  2. 此外,在com.alvazan.test.db包中给出的示例中,这是在Account.java中使用的:

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

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

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

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

2 个答案:

答案 0 :(得分: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),我们在行中存储外键的LIST。在上面的示例中,只有两个表。一行看起来像这样

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

后, 迪恩

答案 1 :(得分:0)

谢谢!我的注释: @NoSQLId只接受String!
任何其他类型,您将收到“Astyanax密钥验证异常”,因为默认ColumnFamily KeyValidationClass = org.apache.cassandra.db.marshal.UTF8Type