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、AreaTableへの外部キーがありますか?とりあえず私の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]クエリを実行するかheadOption、に変換するために使用しますOption[Area]

逆に、のサブエリアを参照する必要がある場合はArea、次を使用できます。

 def subAreas = areaToSubAreas.left(this) 

これにより、を繰り返すことができます。OneToMany[Area]または、を呼び出すこともできますtoList

于 2012-11-01T19:52:52.457 に答える