首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Squeryl 0.9.5迁移到0.9.6

从Squeryl 0.9.5迁移到0.9.6
EN

Stack Overflow用户
提问于 2012-12-19 10:00:34
回答 1查看 946关注 0票数 1

我正在尝试迁移一个现有的应用程序fron SQueryl 0.9.5到0.9.6,以便使用新的扩展字段类型。现在我已经到了应用程序及其测试编译的地步,但是当我试图加载Schema时,我会得到一个运行时错误。

相当长的堆栈跟踪的一部分包括以下内容:

代码语言:javascript
复制
[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方法的失败,即行

代码语言:javascript
复制
if(!c.isPrimitive)
  registry.get(c)

据我所知,类的映射是通过register方法加载的,特别是对于本机类型,我们有行

代码语言:javascript
复制
  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

代码语言:javascript
复制
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)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-19 14:05:18

更正的答案:

您正在导入org.squeryl.PrimitiveTypeMode伙伴对象以及您自己的扩展(对象DateTime扩展PrimitiveTypeMode)

您只能在同一个应用程序上或在另一个应用程序中使用(参见http://squeryl.org/0.9.6.html)

现在不再推荐org.squeryl.PrimitiveTypeMode同伴对象(同名的特征不是)

旧(错)答案:

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

参见此示例:https://github.com/max-l/squeryl-extended-field-types-example JodaDate由(已注册的)时间戳基元类型支持。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13949773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档