私が取り組んでいるプロジェクトは、いくつかの望ましくないMapperの動作に遭遇しました。オブジェクトがデータベースにすでに保存されていない限り、オブジェクトを多対多の関連付けに追加することはできないようです(具体的には、保存されていないオブジェクトを多対多の関連付けから取得することはできません)。
例として、M:N関係にある従業員と部門があります。経理とセキュリティの2つの部門をインスタンス化します。経理は従業員を救われる前に取得し、セキュリティは従業員を救われた後に取得します。
object Employee extends Employee with LongKeyedMetaMapper[Employee]
class Employee extends LongKeyedMapper[Employee] with IdPK {
def getSingleton = Employee
object name extends MappedString(this, 20)
override def toString = name.get
}
object Department extends Department with LongKeyedMetaMapper[Department]
class Department extends LongKeyedMapper[Department] with ManyToMany with IdPK {
def getSingleton = Department
object employees extends MappedManyToMany(
EmployeeDepartment,
EmployeeDepartment.department,
EmployeeDepartment.employee,
Employee)
}
/* Many-to-Many association record */
object EmployeeDepartment extends EmployeeDepartment with LongKeyedMetaMapper[EmployeeDepartment]
class EmployeeDepartment extends LongKeyedMapper[EmployeeDepartment] with IdPK {
def getSingleton = EmployeeDepartment
object employee extends MappedLongForeignKey(this, Employee)
object department extends MappedLongForeignKey(this, Department)
}
object Company extends App {
DB.defineConnectionManager(DefaultConnectionIdentifier, myDBVendor)
val accounting = Department.create
val security = Department.create
accounting.employees ++= Seq(
Employee.create.name("Fred"),
Employee.create.name("Steve"))
security.employees ++= Seq(
Employee.create.name("Dave"),
Employee.create.name("Sonia")) map
{_.saveMe()}
accounting.employees.toList map println; println
security.employees.toList map println
}
出力
フレッド フレッド デイブ ソニア
!!!
経理の社員全員がフレッドになりました!問題は同様に拡大します。まだ保存されていないエンティティを10個追加するとaccounting.employees
、アクセス時にFredへの参照が10個生成されます。
これはバグか、マッパーの有用性に対する深刻な制限のいずれかであるように思われます。次のいずれも含まないこの動作の回避策はありますか?
- モデルの外部にあるデータ構造を使用して、保存する準備ができるまでエンティティと関連付けを追跡する、または
- 作成時にエンティティを保存し、ユーザーが保存について「気が変わった」場合は削除を発行します