我的应用程序定义了两个实体
CardEntity
和TagEntity
,这些实体具有多对多关系。
我已经实现了以下交叉引用表来模拟多对多关系:
@Entity(
primaryKeys = ["card_id", "tag_id"],
foreignKeys = [
ForeignKey(
entity = CardEntity::class,
parentColumns = ["card_id"],// id in CardEntity
childColumns = ["card_id"],// id in TagCardCrossRefEntity
onDelete = ForeignKey.CASCADE,
),
ForeignKey(
entity = TagEntity::class,
parentColumns = ["tag_id"],// id in TagEntity
childColumns = ["tag_id"],// id in TagCardCrossRefEntity
onDelete = ForeignKey.CASCADE,
)
]
)
data class TagCardCrossRefEntity(
@ColumnInfo(name = "card_id")
val cardId: Long,
@ColumnInfo(name = "tag_id")
val tagId: Long
)
我还实现了所有其他所需的方法(如here所解释)。我所有的测试都成功通过。我可以插入、检索和删除带有标签的卡片。
我不确定ForeignKey在交叉引用实体的实现中需要什么。我认为添加ForeignKey的原因之一是定义
onDelete
策略,但似乎如果我删除交叉引用实体中外键的声明,并删除卡表中的CardEntity,则此关系卡也被删除了。
那么为什么我需要在交叉引用表中定义外键?
ForeignKey 添加约束(规则)来强制执行引用完整性。规则是子表中引用父表的列的值必须是父表的某一行中引用的列中的现有值。简而言之,孤儿是不允许的。
除了有助于维护引用完整性的规则ACTIONS之外,还可以在删除或更新父级中的引用列时发生违规(冲突)时设置规则。最常见/有用的 ACTION 是 CASCADE,因此有
onDelete
和 onUpdate
参数。