Squeryl:类型化主键
Squeryl: Typed Primary keys
我想将我的主键定义为特定类型 - 而不仅仅是 Long
或 String
例如
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 项更改:
您不再需要扩展 KeyedEntity。相反,您可以定义一个隐式的 KeyedEntityDef,Squeryl 将使用它来确定对象的哪些字段构成主键。
Squeryl 0.9.6 允许您使用 类.
扩展支持的类型
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 和查看该代码可能也会有所帮助。
我想将我的主键定义为特定类型 - 而不仅仅是 Long
或 String
例如
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 项更改:
您不再需要扩展 KeyedEntity。相反,您可以定义一个隐式的 KeyedEntityDef,Squeryl 将使用它来确定对象的哪些字段构成主键。
Squeryl 0.9.6 允许您使用 类.
扩展支持的类型
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 和查看该代码可能也会有所帮助。