2012-12-19 2 views
1

새로운 extended field types을 사용하기 위해 기존 애플리케이션 fron SQueryl 0.9.5에서 0.9.6으로 마이그레이션하려고합니다. 지금은 응용 프로그램과 테스트가 컴파일되는 시점에 이르렀으나 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) 

개인 확장 기본 형식을이 레지스트리에로드하여 올바르게 사용할 수 있는지 잘 모르겠습니다.

확장 기본 유형을 사용하도록 설정하는 메커니즘은 누구에게 알려져 있습니까?

편집 : 여기

내 모델입니다 - "공식적인"예처럼 보이는 나에게 보인다, 내가 직접 주변 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) 
} 

답변

1

수정 답 :

당신은 org.squeryl.PrimitiveTypeMode 동반자 개체를 가져 (형질을 당신은에서만 사용할 수 있습니다 또는 org.squeryl.PrimitiveTypeMode 동반자 객체가 사용되지 않습니다

동일한 응용 프로그램에서 다른 (http://squeryl.org/0.9.6.html 참조)

또한 자신의 확장 (객체는 날짜 시간 PrimitiveTypeMode을 확장) 같은 이름이

올드 (잘못된) 답)하지로 : 당신은 사용자 정의 유형을 등록 할 필요가 없습니다

, 레지스터는 폐쇄 된 세트입니다 만 원시 JDBC 유형이다.

예 : https://github.com/max-l/squeryl-extended-field-types-example JodaDate는 (이미 등록 된) Timestamp 프리미티브 유형에 의해 지원됩니다.

+0

이것은 정확히 내 첫 번째 링크입니다. 문제는 외관상으로는 확장 된 원시 타입이 등록되어 있지 않다는 것입니다. 내 모델을 질문 본문에 게시 할 것입니다. – Andrea

+0

당신은 내 확장 원시 타입이 등록되지 않았다는 것을 의미합니까? 내 사용자 정의 타입을지지하는 원시 타입이 등록되지 않았습니까? 기본 유형 세트를 확장 할 수 없으므로이 기본 세트는 닫힌 집합입니다. –

+0

내가 말하는 것은 소스를 보면'NonPrimitiveJdbcMapper'의'timeTEF' 인스턴스가 생성 중에 등록되어야한다고 생각합니다. 여전히 'Usupported native type models.fields.DateTime, models.fields.DateTime'과 같은 오류가 발생합니다.만약 내가 올바르게 이해한다면,이 예외는 레지스트리에서'JDBCMapper'의 조회가 실패 할 때'FieldMapper.get'에서 해고됩니다. 즉,'private [squeryl] def register [P, A] (m : NonPrimitiveJdbcMapper [P, A, _])'가 내 필드에 호출되지 않는다고 생각하게됩니다. 이것이 명확하지 않으면 질문 해주십시오. – Andrea