Squeryl的关系和外键

时间:2012-10-31 21:06:41

标签: scala orm lift squeryl

我使用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)
  ))
}

1 个答案:

答案 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