3

如何使用 squeryl 存储用户案例对象?我有一个 Account 对象,其权限字段类型为 Permission(定义为密封特征)。我还有 2 个案例对象(Administrator 和 NormalUser)从 Permission 扩展而来。如何使用 Squeryl 持久化 Account 类。下面的示例代码:

sealed trait Permission
case object Administrator extends Permission
case object NormalUser extends Permission

case class Account(
        id: Long, 
        email: String,
        permission: Permission
) extends KeyedEntity[Long]
4

2 回答 2

4

扩展我的评论,如果您使用自定义类型来检索权限类型,以便它作为整数保存到数据库中(在下面的示例中 1 和 0),您可以覆盖 unapply 方法来查找案例对象和模式匹配应该可以正常工作。我想像下面这样的东西应该可以工作:

class Permission(identifier:Int) extends org.squeryl.customtypes.IntField(identifier) {
  self: CustomType[Int] =>

  private lazy val permissions = 
    List(Administrator, NormalUser).
      map(p => p.value -> p).
      toMap

  def unapply = permissions.get(value)
}

case object Administrator extends Permission(1)
case object NormalUser extends Permission(0)

然后您应该能够使用您的实体定义将权限直接存储在您的代码中:

case class Account(
        id: Long, 
        email: String,
        permission: Permission
) extends KeyedEntity[Long]

您可以将permission字段直接设置为AdministratororNormalUser并且您还应该能够进行模式匹配,例如:

account.permission match {
  case Administrator => ..
  case NormalUser => ..
}
于 2012-11-05T21:11:38.133 回答
0

您需要定义架构:

 object Library extends Schema {

     val authors = table[Author]("AUTHORS")
 }

然后插入实体:

 authors.insert(new Author("Herby Hancock"))

http://squeryl.org/schema-definition.html

http://squeryl.org/inserts-updates-delete.html

为了存储 Permission,它必须继承包 org.squeryl.customtypes 中 CustomType 的子类型之一,并将 org.squeryl.customtypes.CustomTypesMode._ 导入到定义语句的范围内。有关详细信息,请阅读此处的自定义类型部分:http: //squeryl.org/schema-definition.html

于 2012-11-04T14:34:53.680 回答