【问题标题】:Migrating from Squeryl 0.9.5 to 0.9.6从 Squeryl 0.9.5 迁移到 0.9.6
【发布时间】:2012-12-19 10:00:34
【问题描述】:

我正在尝试将现有应用程序从 SQueryl 0.9.5 迁移到 0.9.6,以便使用新的 extended field types。我现在可以编译应用程序及其测试,但是当我尝试加载 Schema 时,我会收到运行时错误。

相当长的堆栈跟踪的一部分包括:

[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)

source 好像异常来自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 时间而是围绕它的一个薄包装,称为 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)
}

【问题讨论】:

    标签: scala squeryl


    【解决方案1】:

    正确答案:

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

    您只能在同一应用程序中使用 on 或 other(请参阅http://squeryl.org/0.9.6.html

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

    旧(错误)答案:

    您不需要注册您的自定义类型,该注册仅适用于原始 JDBC 类型,它是一个封闭集。

    看这个例子:https://github.com/max-l/squeryl-extended-field-types-example JodaDate 由(已注册的)Timestamp 原始类型支持。

    【讨论】:

    • 这正是我的第一个链接。问题是显然我的扩展原始类型没有注册,尽管我认为我和示例一样。我将在问题正文中发布我的模型。
    • 你说:我的扩展原始类型没有注册,你的意思是支持我的自定义类型的原始类型没有注册?因为你不能扩展原始类型的集合,所以它是一个封闭的集合。
    • 我的意思是看源码我认为NonPrimitiveJdbcMapper的实例timeTEF应该在创建时注册。我仍然收到类似Usupported native type models.fields.DateTime,models.fields.DateTime 的错误。如果我理解正确,当在注册表中查找JDBCMapper 失败时,此异常会从FieldMapper.get 触发。也就是说,我认为private [squeryl] def register[P,A](m: NonPrimitiveJdbcMapper[P,A,_]) 不适合我的领域。如果不清楚,请告诉我,以便我解决问题。
    • 如果术语不是很清楚,我很抱歉,但我不知道如何调用 0.9.6 中可用的新字段 - 原始类型和自定义类型已经采用 :-)
    • 对不起,我误解了, register(m: NonPrimitiveJdbcMapper) 确实需要为您的自定义类型调用。您可以在创建 timeTEF 后转储注册表(例如在 DateTime 初始化结束时),或者更好的是,在 GitHub 上放一个可编译的示例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 2012-12-04
    • 2011-04-26
    相关资源
    最近更新 更多