Scala 从Squiryl 0.9.5迁移到0.9.6

Scala 从Squiryl 0.9.5迁移到0.9.6,scala,squeryl,Scala,Squeryl,我正在尝试将现有的应用程序从squeryl0.9.5迁移到0.9.6,以便利用新的应用程序。我现在已经到了编译应用程序及其测试的时候了,但是当我尝试加载模式时,就会出现运行时错误 相当长的stacktrace的一部分包括: [error] ModelSpec.withDB(ModelSpec.scala:14) [error] BucketSpec$$anonfun$1$$anonfun$apply$1.apply(BucketSpec.scala:11) [error] BucketSpec$

我正在尝试将现有的应用程序从squeryl0.9.5迁移到0.9.6,以便利用新的应用程序。我现在已经到了编译应用程序及其测试的时候了,但是当我尝试加载
模式时,就会出现运行时错误

相当长的stacktrace的一部分包括:

[error] ModelSpec.withDB(ModelSpec.scala:14)
[error] BucketSpec$$anonfun$1$$anonfun$apply$1.apply(BucketSpec.scala:11)
[error] BucketSpec$$anonfun$1$$anonfun$apply$1.apply(BucketSpec.scala:11)
[error] Usupported native type models.fields.DateTime,models.fields.DateTime
[error] class java.util.UUID -> java.util.UUID --> null
[error] class java.lang.String -> java.lang.String --> null
[error] class scala.Enumeration$Value -> scala.Enumeration.Val --> null
[error] class [B -> byte[] --> null
[error] class java.lang.Float -> java.lang.Float --> null
[error] class java.util.Date -> java.util.Date --> null
[error] class scala.Enumeration$Val -> scala.Enumeration.Val --> null
[error] class java.lang.Integer -> java.lang.Integer --> null
[error] class java.lang.Double -> java.lang.Double --> null
[error] class java.sql.Timestamp -> java.sql.Timestamp --> null
[error] class java.lang.Byte -> java.lang.Byte --> null
[error] class java.lang.Boolean -> java.lang.Boolean --> null
[error] class scala.math.BigDecimal -> scala.math.BigDecimal --> null
[error] class java.lang.Long -> java.lang.Long --> null
[error] org.squeryl.internals.Utils$.throwError(Utils.scala:95)
[error] org.squeryl.internals.FieldMapper$$anonfun$get$1.apply(FieldMapper.scala:299)
[error] org.squeryl.internals.FieldMapper$$anonfun$get$1.apply(FieldMapper.scala:299)
查看一下,异常似乎来自
FieldMapper.lookup
方法的失败,即

if(!c.isPrimitive)
  registry.get(c)
据我所知,类的映射是通过
register
方法加载的,特别是对于本机类型,我们有以下行

  protected def initialize {
    import PrimitiveTypeSupport._

    register(byteTEF)
    register(intTEF)
    register(longTEF)
    register(floatTEF)
    register(doubleTEF)
    register(bigDecimalTEF)

    register(binaryTEF)
    register(booleanTEF)
    register(stringTEF)
    register(timestampTEF)
    register(dateTEF)
    register(uuidTEF)
我不知道如何在此注册表中加载我的个人扩展基元类型,以便正确使用它们

有人知道我应该通过什么机制启用扩展原语类型吗

编辑:

这是我的模型——在我看来,它看起来像是“官方”的例子,只是我没有直接使用Joda time,而是在它周围使用了一个薄薄的包装,称为
DateTime

object DateTime extends PrimitiveTypeMode {
  import org.squeryl._
  import org.squeryl.dsl._

  implicit val timeTEF = new NonPrimitiveJdbcMapper[Long, DateTime, TLong](longTEF, this) {
    def convertFromJdbc(t: Long) = DateTime(t)
    def convertToJdbc(t: DateTime) = t.timestamp
  }

  implicit val optionTimeTEF =
    new TypedExpressionFactory[Option[DateTime], TOptionLong]
      with DeOptionizer[Long, DateTime, TLong, Option[DateTime], TOptionLong] {

    val deOptionizer = timeTEF
  }

  implicit def timeToTE(s: DateTime) = timeTEF.create(s)

  implicit def optionTimeToTE(s: Option[DateTime]) = optionTimeTEF.create(s)
}
更正答案:

您正在导入org.squeryl.PrimitiveTypeMode伴生对象 还有您自己的扩展(对象DateTime扩展PrimitiveTypeMode)

您只能在同一应用程序中使用on或其他(请参阅)

org.squeryl.PrimitiveTypeMode同伴对象现在不推荐使用(同名的trait不推荐使用)

旧(错)答案:

您不需要注册自定义类型,该寄存器仅用于基本JDBC类型,它是一个封闭集

请参见此示例: JodaDate由(已注册的)时间戳原语类型支持。

正确答案:

您正在导入org.squeryl.PrimitiveTypeMode伴生对象 还有您自己的扩展(对象DateTime扩展PrimitiveTypeMode)

您只能在同一应用程序中使用on或其他(请参阅)

org.squeryl.PrimitiveTypeMode同伴对象现在不推荐使用(同名的trait不推荐使用)

旧(错)答案:

您不需要注册自定义类型,该寄存器仅用于基本JDBC类型,它是一个封闭集

请参见此示例:
JodaDate由(已注册的)时间戳原语类型支持。

这正是我的第一个链接。问题是,显然我的扩展原语类型没有注册,尽管我认为我做的与示例相同。我将在问题正文中发布我的模型。你说:我的扩展基元类型没有注册,你是说支持我的自定义类型的基元类型没有注册吗?因为不能扩展基元类型集,所以它是一个封闭集。我的意思是,查看源代码,我认为非基元JDBCMapper的实例
timeTEF
应该在创建过程中注册。我仍然会遇到一个错误,比如
篡夺了本机类型models.fields.DateTime,models.fields.DateTime
。如果我理解正确,当在注册表中查找
JDBCMapper
失败时,将从
FieldMapper.get
触发此异常。也就是说,我认为我的字段没有调用
private[squeryl]def register[P,A](m:NonPrimitiveJdbcMapper[P,A,)
。如果这不清楚,请告诉我,这样我可以进一步回答这个问题。如果术语不太清楚,我很抱歉,但我不知道如何调用0.9.6中可用的新字段-已使用基本类型和自定义类型:-)抱歉,我误解了,注册(m:非基本JDBCMapper)不需要为自定义类型调用。你能在创建timeTEF之后转储注册表吗(比如在DateTime初始化结束时),或者更好的是,在GitHub上放一个可编译的示例?这正是我的第一个链接。问题是,显然我的扩展原语类型没有注册,尽管我认为我做的与示例相同。我将在问题正文中发布我的模型。你说:我的扩展基元类型没有注册,你是说支持我的自定义类型的基元类型没有注册吗?因为不能扩展基元类型集,所以它是一个封闭集。我的意思是,查看源代码,我认为非基元JDBCMapper的实例
timeTEF
应该在创建过程中注册。我仍然会遇到一个错误,比如
篡夺了本机类型models.fields.DateTime,models.fields.DateTime
。如果我理解正确,当在注册表中查找
JDBCMapper
失败时,将从
FieldMapper.get
触发此异常。也就是说,我认为我的字段没有调用
private[squeryl]def register[P,A](m:NonPrimitiveJdbcMapper[P,A,)
。如果这不清楚,请告诉我,这样我可以进一步回答这个问题。如果术语不太清楚,我很抱歉,但我不知道如何调用0.9.6中可用的新字段-已使用基本类型和自定义类型:-)抱歉,我误解了,注册(m:非基本JDBCMapper)不需要为自定义类型调用。你能在创建timeTEF之后转储注册表吗(比如在DateTime初始化结束时),或者更好的是,在GitHub上放一个可编译的示例?