ORM 框架之 GreenDao(三)多表关联
GreenDao 中,实体间的关联通过 to-one
和 to-many
来实现。
一对一
在 GreenDao 中实现一对一的关联需要讲一个实体类的主键作为另一个实体类的外键。
比如一个 Person
有一个 IDCard
(身份证),这两者是一一对应的关系,同时,Person
有 name
(主键)、sex
和 age
三个属性,
IDCard
有 CardId
和 CardId
(主键) 和 Validity
两个属性。
那么可以将 Person
的主键作为 IDCard
的外键,将 IDCard
的主键作为 Person
的外键:
Entity person = schema.addEntity("Person");
person.addStringProperty("name").primaryKey();
person.addStringProperty("sex");
person.addLongProperty("age");
Entity idCard = schema.addEntity("IDCard");
idCard.addLongProperty("cardId").primaryKey();
idCard.addLongProperty("validity");
// 两个实体类通过 Property 来建立关联,此操作会在 person 表中增加一个外键,此外键是 idCard 表中的主键
Property personProperty = person.addLongProperty("cardId").getProperty();
// 第一个参数为目标实体类,第二个参数为此表中的外键属性
person.addToOne(idCard, personProperty);
Property idCardProperty = idCard.addStringProperty("name").getProperty();
idCard.addToOne(person, idCardProperty);
注意:当使用多表关联的时候,就不要添加 id 主键了,因为需要将主键作为其它表的外键来使用
一对多
比如一个人去购物,会产生很多订单,一个人会有很多订单,但每个订单只能是一个人的,这样就会产生一对多的关联
这时需要将 Person
的主键作为 Order
的外键,因为我们可以通过订单找到唯一的 Person
Entity order = schema.addEntity("Order");
order.addLongProperty("orderId").primaryKey();
order.addLongProperty("money").notNull();
Property orderProperty = order.addStringProperty("name").getProperty();
// 构建一对多的关联
// 第一个参数为目标实体,第二个参数为目标属性,也就是 person 的主键(order 的外键),第三个参数为属性名
person.addToMany(order, orderProperty, "orders");
// 订单对用户为一对一的关联
order.addToOne(person, orderProperty);
这样在生成的实体类中 Person
实体中会多出 List<Order> orders
的属性,并且提供了 getOrders()方法来得到用户的所有订单
Order
实体类中会多出 name
属性,也就是 Person
表的主键,同时也提供了 getPerson()方法来得到该订单对应的用户
多对多
GreenDao 不支持多对多的关系,但是,我们可以通过其它方法来实现。
实现多对多关联需要建立一张中间表,其它两张表都要与中间表构建一对多的关联。
比如学生与课程之间的连系,一个学生可以选择多种课程,而一个课程可以被多个学生选择
Entity course = schema.addEntity("Course");
course.addLongProperty("courseId").primaryKey();
course.addStringProperty("courseName").notNull();
// 中间表有其它两个表的主键作为外键
Entity personCourse = schema.addEntity("PersonCourse");
Property personName = personCourse.addStringProperty("name").getProperty();
Property courseId = personCourse.addLongProperty("courseId").getProperty();
// 分别构建一对多的关联
person.addToMany(personCourse, personName);
course.addToMany(personCourse, courseId);
personCourse.addToOne(person, personName);
personCourse.addToOne(course, courseId);
这样生成的实体类中,Person
和 Course
实体中都会有 List<PersonCourse> personCourseList
属性,
再来看一下 PersonCourse
实体类,有 getPerson()
和 getCourse()
方法获得相应的学生和课程。
这样,我们通过学生和课程得到 PersonCourse
的集合后,通过这两个方法就可以得到相应的学生或者课程的信息