Опитвам се да мигрирам съществуващо приложение от SQueryl 0.9.5 на 0.9.6, за да използвам новите разширени типове полета. Сега съм до момента, в който приложението и неговите тестове се компилират, но получавам грешка по време на изпълнение веднага щом се опитам да заредя 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)
Разглеждайки източник изглежда, че изключението идва от неуспеха на метода 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)
}