首先,我在SO和其他论坛中看到了一些类似的问题,但很多都是针对旧版本的Scala。我希望我的情况还有其他办法可行。另外,我在scala和slick google群组中发布了相同的问题,但尚未收到任何建议。所以希望这里有人能提出一些建议。
我的应用程序中有以下特征/抽象类。
trait Persistable
abstract class BaseEntity extends Persistable {
val id: Long
}
trait Auditable {
val createdDate: java.sql.Timestamp
val modifiedDate : java.sql.Timestamp
}
所有可审核的表都将创建和修改日期。 我的一个案例类看起来像这样。
case class UserAccount(
id: Long,
name: String,
createdDate: java.sql.Timestamp,
modifiedDate: java.sql.Timestamp
) extends BaseEntity with Auditable
我的应用程序是基于spray
和slick
的REST应用程序。
我正在将从客户端发送的json解析为所需的case类。
现在,我想在应用程序中设置createdDate和modifiedDate,而不是仅保存客户端发送的内容。这有两个原因,因为我不想有时区差异问题,也不希望任何人故意弄乱创建的日期/修改日期。
我遵循存储库模式来处理中心位置的所有数据库操作。
trait Repository[TTable <: BaseTable[TEntity], TEntity <: Persistable[Long]] {
def insert(row: TTable#TableElementType): TEntity = {
db.withSession { implicit session =>
if (row.isInstanceOf[Auditable]) {
// set the modifiedDate and createdDate here
(query returning query.map(obj => obj) += row).asInstanceOf[TEntity]
} else {
(query returning query.map(obj => obj) += row).asInstanceOf[TEntity]
}
}
}
}
如何复制整个row
并仅修改createdDate
和modifiedDate
。我想这可以通过使用reflection
来实现,但我阅读了避免反思的建议。有没有其他方法来实现此功能。这不仅仅是这种情况,我还有一些其他情况,如果案例类与另一个特征混合,修改其他字段。
答案 0 :(得分:0)
我建议你创建了Date和modifiedDate作为你的case类的最后两个成员,类型为Option [java.sql.Timestamp]。就插入的抽象而言,这应该是可能的,但需要一些主要的Scala技能,因为你必须确保这些东西具有允许插入的正确的Slick形状。为每个表复制插入方法可能更为可行。您可以自定义光滑的代码生成器来为您执行此操作,这仍然需要一些修改,但应该更容易。