我有一种情况,我的许多表都需要相同的列:
- 编号:长
- 创建:时间戳
然而,网络从未使用过“created”列,“id”是。
为此,我使用了一个抽象类和对象:
abstract class BaseObject{
val id:Option[Long]
}
abstract class BaseTable[T <: BaseObject](tableName: String) extends Table[T](None, tableName) {
def this() {
this("BaseTable")
}
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def created = column[Timestamp]("created",O.NotNull)
def autoInc = * returning id
}
然后我实现了一个具体的客户端:
case class Client(id: Option[Long] = None, name: String = "", contact: String = "", phone: String = "", email: String = "") extends BaseObject
object Clients extends BaseTable[Client]("CLIENT") {
def name = column[String]("name", O.NotNull)
def contact = column[String]("contact")
def phone = column[String]("phone")
def email = column[String]("email")
def * = id.? ~ name ~ contact ~ phone ~ email <>(Client.apply _, Client.unapply _)
}
然后是 ClientController 的一部分:
object ClientController extends Controller {
val form = Form(
mapping(
"id" -> optional(longNumber),
"name" -> nonEmptyText,
"contact" -> text,
"phone" -> text,
"email" -> text
)(Client.apply)(Client.unapply)
)
}
现在的问题是,我不希望将“已创建”列返回到 Web,这就是为什么它不包含在客户端案例类、默认投影或控制器表单中的原因。我只想将它设置为创建,所以我所做的是:
def doUpdate(client: Client)(implicit s: Session): Client = {
if (client.id.isDefined) {
Clients.where(_.id === obj.id).update(client)
} else {
Clients.autoInc.insert(obj)
Clients.where(_.id === updated.get).map(_.created).update(new Timestamp(System.currentTimeMillis()))
}
client
}
我的问题是光滑不会生成“创建”
扩展 BaseTable 的任何表的列。如果我手动添加“创建”列,一切正常。有没有办法仍然使用光滑的 ddl 生成并完成此操作?