Lift Mapper - черта с отображением OneToMany - PullRequest
0 голосов
/ 18 февраля 2012

ОБНОВЛЕНИЕ: Изменены образцы, чтобы отразить мою текущую ситуацию

Довольно новый для поднятия, и я пытаюсь создать модель для моего приложения.Поскольку я хочу сохранить вещи в духе DRY, я хочу использовать миксины черт, чтобы указать некоторые поля в моей модели.Например, у меня есть черта Person, которую я смешиваю с моим Employee классом:

trait Person[T <: LongKeyedMapper[T]] extends LongKeyedMapper[T]{
  self: T =>
  object firstName extends MappedString[T](this, 50)
  object lastName extends MappedString[T](this, 50)
  object civicRegNumber extends MappedString[T](this, 12)
}

class Employee extends IdPK with OneToMany[Long, Employee] with Person[Employee] {
  def getSingleton = Employee

  object contactInfos extends MappedOneToMany(EmployeeContactInfo, EmployeeContactInfo.person) 
}

object Employee extends Employee with LongKeyedMetaMapper[Employee] 

Как видно, у меня есть контактная информация, отображающая множество на одно в Employee.Это выглядит так:

trait PersonContactInfo[T <: LongKeyedMapper[T],P <: Person[P]] extends LongKeyedMapper[T] {
  self: T =>
  object email extends MappedEmail[T](this, 80)
  def personMeta:P with LongKeyedMetaMapper[P]
  object person extends LongMappedMapper[T,P](this, personMeta)
}

class EmployeeContactInfo extends IdPK with PersonContactInfo[EmployeeContactInfo, Employee] {
  def getSingleton = EmployeeContactInfo
  val personMeta = Employee

}
object EmployeeContactInfo extends  EmployeeContactInfo with LongKeyedMetaMapper[EmployeeContactInfo]

Кажется, это работает, но я бы хотел переместить объект contactInfos в мою черту Person.Однако я не могу понять, как этого добиться ... Возможно ли вообще наследовать сопоставления OneToMany от признаков?Любая помощь приветствуется!

1 Ответ

1 голос
/ 25 февраля 2012

После нескольких попыток я заставил это работать, отделив черту, которая выполняет сопоставление PersonToneMany Person с PersonContactInfo.Вот как это выглядит сейчас

trait Person[T <: Person[T]] extends LongKeyedMapper[T]{
  self: T =>
  object firstName extends MappedString[T](this, 50)
  object lastName extends MappedString[T](this, 50)
  object civicRegNumber extends MappedString[T](this, 12)
}

trait PersonToPersonContacts[P <: Person[P], PCI <: PersonContactInfo[PCI, P]] extends OneToMany[Long,P] {
  self: P =>
  def contactInfoMeta:LongKeyedMetaMapper[PCI] with PCI
  object contactInfos extends MappedOneToMany(contactInfoMeta, contactInfoMeta.person)
}

class Employee extends IdPK with Person[Employee]  with PersonToPersonContacts[Employee, EmployeeContactInfo] {
  def getSingleton = Employee
  override def contactInfoMeta = EmployeeContactInfo
}
object Employee extends Employee with LongKeyedMetaMapper[Employee] 

, и мой PersonContactInfo теперь выглядит так:

trait PersonContactInfo[T <: LongKeyedMapper[T],P <: Person[P]] extends LongKeyedMapper[T] {
  self: T =>
  object email extends MappedEmail[T](this, 80)
  def personMeta:P with LongKeyedMetaMapper[P]
  object person extends LongMappedMapper[T,P](this, personMeta)
}

class EmployeeContactInfo extends IdPK with PersonContactInfo[EmployeeContactInfo, Employee] {
  def getSingleton = EmployeeContactInfo

  val personMeta = Employee

}
object EmployeeContactInfo extends  EmployeeContactInfo with LongKeyedMetaMapper[EmployeeContactInfo]

Все еще не уверен, что это способ решить эту проблему, но он делает свою работу :)

...