Мигриране от Squeryl 0.9.5 към 0.9.6

Опитвам се да мигрирам съществуващо приложение от 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)
}

person Andrea    schedule 19.12.2012    source източник


Отговори (1)


Коригиран отговор:

Вие импортирате придружаващия обект org.squeryl.PrimitiveTypeMode, а също и вашето собствено разширение (обектът DateTime разширява PrimitiveTypeMode)

Можете да използвате само on или другия в едно и също приложение (вижте http://squeryl.org/0.9.6.html)

Придружаващият обект org.squeryl.PrimitiveTypeMode вече е остарял (характерът със същото име не е)

Стар (грешен) отговор:

Не е необходимо да регистрирате персонализираните си типове, регистърът е само за примитивни JDBC типове, това е затворен набор.

Вижте този пример: https://github.com/max-l/squeryl-extended-field-types-example JodaDate се поддържа от (вече регистриран) примитивен тип Timestamp.

person Max L.    schedule 19.12.2012
comment
Точно това е първият ми линк. Проблемът е, че очевидно моят разширен примитивен тип не е регистриран, въпреки че мисля, че правя същото като примера. Ще публикувам моя модел в тялото на въпроса. - person Andrea; 19.12.2012
comment
казвате: моят разширен примитивен тип не е регистриран, искате да кажете, че примитивният тип, който поддържа моя персонализиран тип, не е регистриран? Тъй като не можете да разширите набора от примитивни типове, той е затворен набор. - person Max L.; 19.12.2012
comment
Това, което имам предвид е, че като гледам източника, мисля, че екземплярът timeTEF от NonPrimitiveJdbcMapper трябва да бъде регистриран по време на създаването. Все пак получавам грешка като Usupported native type models.fields.DateTime,models.fields.DateTime. Ако разбирам правилно, това изключение се задейства от FieldMapper.get, когато търсенето на JDBCMapper в системния регистър е неуспешно. Това означава, че съм накаран да мисля, че private [squeryl] def register[P,A](m: NonPrimitiveJdbcMapper[P,A,_]) не се извиква за моето поле. Ако това не е ясно, моля, кажете ми, за да мога да разширя въпроса. - person Andrea; 19.12.2012
comment
Извинявам се, ако терминологията не е много ясна, но не знам как да извикам новите полета, които са налични в 0.9.6 - примитивните и потребителските типове вече са заети :-) - person Andrea; 19.12.2012
comment
Съжалявам, че не съм разбрал, register(m: NonPrimitiveJdbcMapper) наистина трябва да бъде извикан за вашия потребителски тип. Можете ли да изхвърлите регистъра, след като се създаде timeTEF (като в края на инициализацията на DateTime), или дори по-добре, да поставите пример за компилиране в GitHub? - person Max L.; 19.12.2012
comment
Благодаря ти за помощта; Ще се опитам да извлека минимален пример от приложението, но не е лесно, тъй като не е тривиално Play! проект. - person Andrea; 19.12.2012
comment
Изглежда, че когато извлека съответната част, всичко работи правилно. Ще опитам да изхвърля регистъра - person Andrea; 19.12.2012
comment
Следвайки източника, виждам, че съдържанието на регистъра вече е изхвърлено, когато възникне изключение, и вече е в тялото на въпроса. Това е частта от проследяването на стека, която привлече вниманието ми на първо място. Не виждам никакъв разширен примитивен тип там. - person Andrea; 19.12.2012
comment
Предполагам, че имате повече от един екземпляр на PrimitiveTypeMode, DateTime ще бъде единият, а обектът PrimitiveTypeMode може да бъде другият. Класът Schema приема имплицитно FieldMaper като аргумент, моля, проверете дали това е вашият обект DateTime, който му се предава. - person Max L.; 19.12.2012
comment
Обмислям да отхвърля обекта PrimitiveTypeMode, ако се случи да го импортирате в обхват, ще получите поведението, което виждате. - person Max L.; 19.12.2012
comment
Благодаря много, това беше! Наистина е хубаво да видя автора на библиотека, която използвам, да помага на StackOverflow. :-) Това вече се случи с Eric Torreborre, когато имах проблем със Specs2. Може би можете да обмислите актуализиране на отговора с действителния проблем, така че да не е заровен в коментарите. - person Andrea; 20.12.2012