不发送并指定模型的字段值

时间:2014-01-05 12:17:10

标签: scala playframework anorm

我在Play应用中使用了一个类作为模型:

case Class1(
  id: Pk[UUID] = NotAssigned,
  addedAt: DateTime = null
)

object Class1 {
  //....
}

字段added_at在db now()中有一个默认值,在db中不能是NULL。但是,当我想创建一个Class1实例时,我必须指定它,即使我不想发送它db,因为它将在db中设置为now()

Class1(addedAt = DateTime.now())

使用null作为默认值似乎不是一个明智的想法,使用Option[DateTime] = None没有意义,因为它在db中不能为空。 我该怎么办呢:我希望它存在于Class1中,因为它存在于db中,但同时我不想指定它,因为它不需要它?

2 个答案:

答案 0 :(得分:1)

想象一下,您刚刚创建了此类的对象,但尚未将其发送到数据库。 (new Class1).addedAt的结果是什么?您需要未分配的概念,与id相同。由于它不是主键,因此表达它的正常方式 Option。如果您可以确保始终使用已经发送到数据库访问层之外的数据库的对象,那么请将Option[DateTime]保留在DAL中,但不要直接在程序中不使用它需要处理它未分配:

case class Class1DAL(..., addedAt: Option[DateTime])

// must ensure it is never seen with x not sent to DB
class Class1(x: Class1DAL) {
  def id = x.id

  def addedAt: DateTime = 
    x.addedAt.getOrElse(throw new IllegalStateException("Class1.addedAt unassigned, which should be impossible")
}

答案 1 :(得分:0)

初始化与未初始化绝对是对Option值的有效理解,并且不会强迫您推断 该事物的初始化。

在这种情况下,如果您想避免误解,只需将值重命名为addedToDb就足够了 - 或者如果不能重命名则使用等效的文档注释。

对于尚未添加到数据库的对象,我认为addedToDb Nonenull不会有问题!

另外......不要使用{{1}},这是邪恶的