用squeryl存储case对象

时间:2012-11-04 13:49:41

标签: scala squeryl

如何使用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]

2 个答案:

答案 0 :(得分: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字段直接设置为AdministratorNormalUser,您还应该能够将匹配模式设置为:

account.permission match {
  case Administrator => ..
  case NormalUser => ..
}

答案 1 :(得分: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,它必须在包中继承CustomType的一个子类型 org.squeryl.customtypes,并导入org.squeryl.customtypes.CustomTypesMode._ 进入定义语句的范围。有关详细信息,请参阅此处的自定义类型部分:http://squeryl.org/schema-definition.html