仅在已知混合特征时复制案例类的所有字段

时间:2015-02-13 05:48:22

标签: scala reflection slick traits

首先,我在SO和其他论坛中看到了一些类似的问题,但很多都是针对旧版本的Scala。我希望我的情况还有其他办法可行。另外,我在scalaslick 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

我的应用程序是基于sprayslick的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并仅修改createdDatemodifiedDate。我想这可以通过使用reflection来实现,但我阅读了避免反思的建议。有没有其他方法来实现此功能。这不仅仅是这种情况,我还有一些其他情况,如果案例类与另一个特征混合,修改其他字段。

1 个答案:

答案 0 :(得分:0)

我建议你创建了Date和modifiedDate作为你的case类的最后两个成员,类型为Option [java.sql.Timestamp]。就插入的抽象而言,这应该是可能的,但需要一些主要的Scala技能,因为你必须确保这些东西具有允许插入的正确的Slick形状。为每个表复制插入方法可能更为可行。您可以自定义光滑的代码生成器来为您执行此操作,这仍然需要一些修改,但应该更容易。