0

如何实现与 Mapper 的一对一关系?从电梯维基:

如果您要建模一对一关系,只需使用一对多关系。唯一潜在的麻烦是您将拥有一个 List[B] 而不是 Box[B]。

没有更惯用的方法吗?

4

1 回答 1

1

我可能会通过降低一对多关系的可见性来解决它,并创建一个 getter/setter:

protected object comments extends 
  MappedOneToMany(Comment, Comment.post, OrderBy(Comment.id, Ascending))

def comment : Option[Comment] = {
  comments match {
    case Nil => None
    case head :: _ => Some(head)
  }
}

def comment_=(comment: Comment) = {
  comments.clear
  comments += comment
}

理想的?不,但比让客户端代码处理 List[Comment] 而不是 Option[Comment] 更惯用?我认同。

沿着同一条线,您还可以创建自己的扩展 MappedOneToMany 的类。这段代码未经测试,但我相信它的精神:

class MappedOneToOne[K,T<:KeyedMapper[K, T],O <: Mapper[O]]
  (meta: MetaMapper[O], foreign: MappedForeignKey[K,O,T], qp: QueryParam[O]*) extends MappedOneToMany(meta, foreign, qp) {

  def get : Option[O] = {
    all match {
      case Nil => None
      case head :: _ => Some(head)
    }
  }

  def set(o: O) : O = {
    clear
    this += o
    o
  }
}

class Foo extends KeyedMapper[Int,Foo] {
  object bar extends MappedOneToOne[Int,Foo,Bar]
}

f.bar.get match {
  case Some(bar) => println("Got bar")
  case _ =>
}
于 2010-11-06T15:03:07.007 回答