0

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

1 回答 1

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]您查询的一个,或使用headOptionon 转换为一个Option[Area].

相反,如果您需要引用 上的子区域Area,您可以使用:

 def subAreas = areaToSubAreas.left(this) 

这将产生一个OneToMany[Area]可以迭代的,或者你也可以调用toList.

于 2012-11-01T19:52:52.457 回答