级联插入

本文将指导您如何使用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()