2

Lift の Mapper を使用する必要があります (Scala にはもっと優れた ORM があるかもしれませんが、これは今すぐ変更できるものではありません)。通常、Mapper では、テーブルは次のように定義されます。

package com.sample.model

import net.liftweb.mapper._

class Table extends LongKeyedMapper[Table] with IdPK {
  def getSingleton = Table

  object other_table_id extends MappedLongForeignKey(this, OtherTable)
  object date_field extends MappedDate(this)
  object string_field extends MappedString(this, 255)

  def toCaseClass = ...
}

object Table extends Table with LongKeyedMetaMapper[Table]

ここで、レコードをより簡単に操作するために Table のケース クラスを定義したいと思います。Mapper はあまり「Scala 慣用的」ではなく、タイプ セーフでもなく、間違いなく不変でもないからです。私のケースクラスは次のようになります。

case class TableCC(id: Long, otherTableId: Long, dateField: Option[Date], ...) {
  def toMapper = ...
}

ケース クラスの名前と配置場所を教えてください。

  1. 別の名前 (TableCC または TableCaseClass) の com.sample.model では?
  2. 同じ名前 (テーブル) の別のパッケージ (例: com.sample.model.caseclass) で?
  3. テーブル オブジェクトでは?
  4. ...?
4

1 に答える 1

2

まず、別のORMを使用することはできないとおっしゃっていましたが、非常にうまく機能するscala用のケースクラスベースのORMがあります。(Slickは基本的にこのように機能しますが、他にもいくつかあります)

個人的には、このケースクラスをドメインを操作する主な方法として使用する場合は、それらすべてを独自のパッケージに入れます。そうすれば、ドメインを操作している場合、次のことができます。

import com.sample.model.caseclass._

注意すべきいくつかのポイント:

ケースクラスと同じ名前を付けないでください。これは混乱を招きます。ある時点で、同じファイル内の両方のクラスを使用する必要があることを保証します。その場合、どちらかをエイリアスする必要があります。

TableやTableCCのような名前を使用します。このようにして、IDEでどちらかを簡単に見つけることができます。

于 2012-11-08T14:58:19.940 に答える