题
如何与映射者建立一对一的关系?来自Lift Wiki:
如果您想建模一对一的关系,只需使用一对多的关系即可。唯一潜在的麻烦是您将拥有一个列表[B]而不是盒子[B]。
没有更惯用的方式吗?
解决方案
我可能会通过降低一对多关系的可见性来处理它,并创建一个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
}
理想的?否。但是,比让客户端代码处理列表[注释]而不是选项[注释]更惯用性吗?我认同。
沿着同一条行,您还可以创建自己的类,以扩展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 _ =>
}
不隶属于 StackOverflow