我想弗朗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)
}
這也正是我的第一個環節。問題是,顯然我的擴展原始類型沒有註冊,雖然我認爲我也是這樣做的例子。我將在問題主體中發佈我的模型。 – Andrea
你說:我的擴展原始類型沒有註冊,你的意思是支持我的自定義類型的原始類型沒有註冊?因爲你不能擴展原始類型的集合,所以它是一個封閉的集合。 –
我的意思是看着源代碼,我認爲創建時應該註冊NonPrimitiveJdbcMapper的實例'timeTEF'。不過,我收到一個錯誤,例如'支持的本機類型models.fields.DateTime,models.fields.DateTime'。如果我理解正確,那麼當註冊表中的JDBCMapper的查找失敗時,此異常將從FieldMapper.get中觸發。也就是說,我認爲'private [squeryl] def register [P,A](m:NonPrimitiveJdbcMapper [P,A,_])'不會被我的字段調用。如果不清楚,請告訴我,以便我可以解決問題。 – Andrea