2012-12-19 56 views
1

我想弗朗SQueryl 0.9.5現有的應用程序遷移到0.9.6,以使用新extended field types的。我現在到了應用程序及其測試編譯的位置,但是一旦我嘗試加載Schema,就會收到運行時錯誤。從Squeryl 0.9.5遷移到0.9.6

相當長的堆棧跟蹤的一部分包括此:

[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方法的失敗,即行source

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) 

我不知道怎麼裝我個人的擴展基本類型在此註冊表,使他們正確使用。

有誰知道什麼是通過它我應該能夠擴展原始類型的機制?

編輯:

這裏是我的模型 - 在我看來,它看起來像「官方」的例子,保存,我不直接使用喬達時間,但圍繞一個瘦包裝的事實它,這就是所謂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) 
} 

回答

1

更正答案:

要導入的org.squeryl.PrimitiveTypeMode同伴對象 也是自己的分機(對象日期時間延長PrimitiveTypeMode)

您只能使用上或同一應用程序的其他(見http://squeryl.org/0.9.6.html

的org.squeryl.PrimitiveTypeMode同伴對象現在已經過時(性狀具有相同的名稱是不是)

舊(錯誤)答案:

你並不需要註冊您的自定義類型,寄存器是隻爲原始JDBC類型,它是一個封閉集。

請參閱此示例:https://github.com/max-l/squeryl-extended-field-types-example JodaDate由(已註冊的)Timestamp基元類型支持。

+0

這也正是我的第一個環節。問題是,顯然我的擴展原始類型沒有註冊,雖然我認爲我也是這樣做的例子。我將在問題主體中發佈我的模型。 – Andrea

+0

你說:我的擴展原始類型沒有註冊,你的意思是支持我的自定義類型的原始類型沒有註冊?因爲你不能擴展原始類型的集合,所以它是一個封閉的集合。 –

+0

我的意思是看着源代碼,我認爲創建時應該註冊NonPrimitiveJdbcMapper的實例'timeTEF'。不過,我收到一個錯誤,例如'支持的本機類型models.fields.DateTime,models.fields.DateTime'。如果我理解正確,那麼當註冊表中的JDBCMapper的查找失敗時,此異常將從FieldMapper.get中觸發。也就是說,我認爲'private [squeryl] def register [P,A](m:NonPrimitiveJdbcMapper [P,A,_])'不會被我的字段調用。如果不清楚,請告訴我,以便我可以解決問題。 – Andrea