我使用Scala,Squeryl和MySql构建一个Web应用程序。
我发现将简单数据保存为字符串或整数很容易。但是,当我有对象之间的关系,我需要使用外键。在我的应用程序中,我有区域和子区域,其属性类型为区域(它们所属的区域),因此我的区域和子区域就像这些
class Area(
var idArea: String,
@BeanProperty
var name:String,
@BeanProperty
var letter: String,
@BeanProperty
var color: String
)
extends Idable {
def this() = this("","", "","")
}
class SubArea(var idSubArea: String,
@BeanProperty
var name: String,
@BeanProperty
var area:Area
) extends Idable {
def this() = this("","",null )
我如何定义架构,所以我的SubArea表有一个Area id,我的Area Table的外键? 目前我的SubArea架构就像这些
object SubAreaSchema extends Schema {
val subAreas=table[SubArea]
on(subAreas)(subArea => declare(
subArea.id is (autoIncremented),
subArea.name is (unique)
))
}
答案 0 :(得分:2)
您可以使用以下内容定义架构中的关系:
val areaToSubAreas = oneToManyRelation(areas, subAreas).via((a,sA) => s.idArea === sa.areaId)
为了实现这一目标,您需要修改您的SubArea类直接加载外键的ID,如下所示areaId:String
。
class SubArea(var idSubArea: String,
@BeanProperty
var name: String,
@BeanProperty
var areaId: String)
然后在方法体中,如果要访问该对象,可以使用:
def area = areaToSubAreas.right(this)
将生成您查询的ManyToOne[Area]
,或使用headOption
打开以转换为Option[Area]
。
相反,如果您需要在Area
上引用子区域,您可以使用:
def subAreas = areaToSubAreas.left(this)
将产生可以迭代的OneToMany[Area]
,或者您也可以调用toList
。