级联插入
本文将指导您如何使用Kronos的级联插入功能。
1. 一对一级联关系
本节将介绍对于Kronos中定义的一对一级联关系的级联插入。
数据类定义
我们定义User和Profile两个实体类,User实体类中包含了一个Profile实体类的引用,Profile实体类中包含了一个User实体类的引用。
User.kt
data class User(
@PrimaryKey
var id: Long? = null,
var name: String? = null,
var profileId: Long? = null,
@Cascade(["profileId"], ["id"])
var profile: Profile? = null
)Profile.kt
data class Profile(
@PrimaryKey
var id: Long? = null,
var name: String? = null,
var userId: Long? = null,
@Cascade(["userId"], ["id"])
var user: User? = null
)级联插入
插入User或Profile实体都可以进行级联插入,级联插入会自动为级联创建的实体的引用属性赋值(支持自增主键和多层级级联关系)。
User(
name = "user",
profile = Profile(
name = "profile"
)
).insert().execute()或者:
Profile(
name = "profile",
user = User(
name = "user"
)
).insert().execute()2. 一对多级联关系
一对多关系和一对一关系的用法类似。
数据类定义
首先,我们定义以下的Parent和Child两个实体类,Parent实体类中包含了一个Child实体类的集合,Child实体类中包含了一个Parent实体类的引用。
Parent.kt
data class Parent(
@PrimaryKey(identity = true)
var id: Long? = null,
var name: String? = null,
var children: List<Child> = listOf()
)Child.kt
data class Child(
@PrimaryKey(identity = true)
var id: Long? = null,
var name: String? = null,
var parentId: Long? = null,
@Cascade(["parentId"], ["id"])
var parent: Parent? = null
)级联插入
使用KPojo.insert()方法,可以实现一对多级联关系的级联插入。
在Kronos中的一对多插入时,仅支持Parent -> Child方向的级联插入。
在级联插入时不需要指定Child实体的parentId,级联插入会自动为Child实体的parentId赋值(支持自增主键和多层级级联关系)。
Parent(
name = "parent",
children = listOf(
Child(
name = "child-1"
),
Child(
name = "child-2"
)
)
).insert().execute()以下是一个更加复杂的、层级更深的例子:
School.kt
data class School(
@PrimaryKey
var id: Long? = null,
var name: String? = null,
var groupClasses: List<GroupClass> = listOf()
)GroupClass.kt
data class GroupClass(
@PrimaryKey
var id: Long? = null,
var name: String? = null,
var schoolId: Long? = null,
@Cascade(["schoolId"], ["id"])
var school: School? = null,
var students: List<Student> = listOf()
)Student.kt
data class Student(
@PrimaryKey
var id: Long? = null,
var name: String? = null,
var groupClassId: Long? = null,
var schoolId: Long? = null,
@Cascade(["groupClassId", "schoolId"], ["id", "schoolId"])
var groupClass: GroupClass? = null
)School(
name = "school",
groupClasses = listOf(
GroupClass(
name = "group-class-1",
students = listOf(
Student(
name = "student-1"
),
Student(
name = "student-2"
)
)
),
GroupClass(
name = "group-class-2",
students = listOf(
Student(
name = "student-3"
),
Student(
name = "student-4"
)
)
)
)
).insert().execute()3. 多对多级联关系
通过manyToMany委托,Kronos简化多对多关系为一对多关系,并为您自动创建关联表记录,详见:📚级联关系定义 - 使用委托实现级联多对多跨中间表关系。
数据类定义
首先我们定义User、Role、Relation三个实体类,其中Relation实体类中包含了User和Role两个实体类的引用,User和Role通过manyToMany委托关联。
User.kt
data class User(
@PrimaryKey
var id: Long? = null,
var name: String? = null,
var relations: List<Relation> = listOf()
){
var roles: List<Role> by manyToMany(::relations)
}Role.kt
data class Role(
@PrimaryKey
var id: Long? = null,
var name: String? = null,
var relations: List<Relation> = listOf()
){
var users: List<User> by manyToMany(::relations)
}Relation.kt
data class Relation(
@PrimaryKey
var id: Long? = null,
var userId: Long? = null,
var roleId: Long? = null,
@Cascade(["userId", "roleId"], ["id", "id"])
var user: User? = null,
@Cascade(["userId", "roleId"], ["id", "id"])
var role: Role? = null
)级联插入
插入User或Role实体都可以进行级联插入,级联插入会自动为级联创建的实体的引用属性赋值(支持自增主键和多层级级联关系)。
User(name = "user")
.apply { roles = listOf(Role(name = "role")) }
.insert().execute()或者:
Role(name = "role")
.apply { users = listOf(User(name = "user")) }
.insert().execute()