Squeryl:键入的主键

时间:2015-01-06 13:37:35

标签: scala types type-conversion squeryl

我想将主键定义为特定类型 - 不只是LongString

例如

case class Project(
                    var id: ProjectId = 0,

这样做的一个好处是,如果我意外地比较不同的密钥 - 那么编译器就会把它拿起来。

显然这会产生编译错误

overriding method id in trait KeyedEntity of type => Long;
 variable id has incompatible type

是否有成功实施此类方法的示例?

附录 - ProjectId可能是

的草稿
trait SelfType[T] {
  val self : T
}

class Content_typeId( val self: Int) extends SelfType[Int]
class ProjectId( val self: Long) extends SelfType[Long]
object ProjectId {
  implicit def baseToType(self: Long) = new ProjectId(self)
  implicit def typeToBase(higherSelf: ProjectId) : Long = higherSelf.self

}

由于 布伦特

1 个答案:

答案 0 :(得分:1)

是的,可以做到,但是你想要升级到Squeryl 0.9.6。目前最新版本为RC3。您希望利用以下两项更改:

  1. 您不再需要扩展KeyedEntity。相反,您可以定义一个隐式的KeyedEntityDef,Squeryl将使用它来确定对象的哪个字段构成主键。

  2. Squeryl 0.9.6允许您使用类型类扩展支持的类型。

  3. RC3非常稳定,我自己在几个生产项目中使用它,但是还没有关于这些功能的官方文档。您可以在列表中找到示例,我看到您也发布了此问题。

    我还建议查看PrimitiveTypeMode(为类型公开TEF的过程)和PrimitiveTypeSupport(这是定义TypedExpressionFactory实例的位置)的方式。 KeyedEntity本身受KeyedEntityDef By Squeryl支持,查看该代码也可能有所帮助。