Squeryl:类型化主键

Squeryl: Typed Primary keys

我想将我的主键定义为特定类型 - 而不仅仅是 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

}

谢谢 布伦特

是的,可以做到,但您需要升级到 Squeryl 0.9.6。目前最新可用的是 RC3。您需要利用 2 项更改:

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

  2. Squeryl 0.9.6 允许您使用 类.

  3. 扩展支持的类型

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

我还建议查看 PrimitiveTypeMode (the process of exposing a TEF for a type) and PrimitiveTypeSupport (which is where the TypedExpressionFactory instances are defined). KeyedEntity itself is supported with a KeyedEntityDef By Squeryl 和查看该代码可能也会有所帮助。