2012-06-21 3 views
2

그의 comparison of ScalaQuery and Squeryl, 스테판 Zeiger (ScalaQuery의 저자)이 세 번째 글 머리 기호 점에서 말한다 :매핑 사용자 정의 유형/R 프레임 워크에서

ScalaQuery는 JDBC 유형의 기본 세트에 대한 지원이 제공하고 DBMS 또는 응용 프로그램 특정 유형으로 확장 된 이 될 수 있습니다.

실제로 이것을 수행하는 방법에 대한 예제 나 설명을 찾을 수 없었습니다. Postgres 데이터베이스에 ScalaQuery 스키마를 작성하려고합니다. 일부 열은 Postgres에서 만든 사용자 정의 열거 형입니다.

예를 들어, 가능한 값이 malefemalegender이라는 열거 형이 있습니다. 이것은 Java enum이 아니며 데이터베이스에 정수로 저장됩니다. 오히려 DBMS 내에 정의 된 사용자 정의 Postgres 유형입니다. Postgres는 프리미티브가 아닌 특수한 4 바이트 데이터 구조를 가진 것들을 저장합니다.

gender 유형의 Postgres 열을 ScalaQuery 스키마에 통합하려면 어떻게해야합니까?

(강하게 입력 된 다른 O/R 방식이 작업에 더 적합하다고 생각하면 의견을 보내 주시면 감사하겠습니다. 이미 Squeryl을 살펴본 결과 사용자 지정 유형을 처리 할 수 ​​있다고 생각하지 않습니다. .)이 DBMS의 기본 요소로

답변

3
import org.scalaquery.ql.{MappedTypeMapper => Mapper} 

object TypeMapper { 

    type Stamp = java.sql.Timestamp 

    val joda2Stamp = 
    Mapper.base[JodaTime, Stamp](
     dt => new Stamp(dt.getMillis), 
     ts => new JodaTime(ts.getTime)) 
} 

을 지속하고) 쿼리를 실행할 때마다 다음, 예를 들어, DAO에 (또는, 그것을 사용

import TypeMapper._ 
implicit val j2Stamp = joda2Stamp // type conversion automatically 

을 당신은 달성하기 위해 실험을해야합니다 Enums 및 PostGres의 열거 형 저장 유형에도 동일합니다. Java Enum을 사용하고 기본 유형으로 저장하는 것을 선호합니다.

예를 들어

:

public enum CardType implements ILabel { 
    V("Visa"), 
    M("MasterCard"), 
    D("Discover"), 
    A("American Express"); 

    private CardType(String label) { this.label = label; } 
    public String getLabel() { return this.label; } 
    final String label; 

    public static List<String> asList() { 
    return EnumHelper.asList(CardType.class); 
    } 

    public static Map<String,String> asMap() { 
    return EnumHelper.asMap(CardType.class); 
    } 
} 

다음 문자로 저장 (1) DB 라 Orders.insert(cardType = cardType.toString)에, 또는 유형 매퍼 열거 문자열 변환을 만들 수 있고 삽입에 enum.toString을 생략 ...

+0

감사합니다. 데이터베이스 기본 열거 형을 사용하면 처리하려는 것보다 훨씬 오버 헤드가 많습니다. 나는 여전히 열거가 데이터베이스 수준에서 시행되기를 원한다. 그러나, 나는 이것을 VARCHAR 타입으로 바꾸고 테이블에 constraint 트리거를 추가하여 INSERT와 UPDATE를 유효하지 않은 값으로 차단할 것이라고 생각한다. –

+0

네, DB 열거 형, 그걸 팔지 않아요, 어떻게 HTML 선택/라디오/체크 박스 목록을 만들겠습니까? DB를 쿼리해야합니다. Java 열거 형을 사용하면 DB를 쿼리하지 않고 html 요소를 생성 할 수 있습니다 (또는 어쨌든 얻을 수있는 열거 형 값을 포함하는 대상 레코드 만 쿼리하면됩니다). 유형 매퍼 enum-string을 생성하면 DAO 지속성 작업에서 열거 형 값 제약 조건. 물론 DB 트리거는 가장 안전합니다.하지만 DAO 레이어를 통해 항상 지속되는 경우에는 결코 발생하지 않을 응용 프로그램 계층에서 예외를 처리해야합니다. Fun, fun ;-) – virtualeyes

+0

데이터베이스 기본 열거 형에 대한 좋은 점은 데이터베이스가 Java 외부에서 사용될 때 여전히 적용된다는 것입니다. 필자는 대기업에서 일하면서 대부분의 경력을 쌓았으며, 자바 웹 애플리케이션, .NET 데스크톱 애플리케이션, Perl이나 Python cron 작업 등에서 데이터베이스를 사용할 수 있다고 가정하는 데 익숙합니다. 따라서 제 본능 지속성 계층에서 제약을 적용하기 위해 응용 프로그램 계층에 의존하지 않아야합니다. 나는 당신이 데이터베이스에 쓸 일은 아무것도없는 작은 앱으로 작업하고 있다면 앱의 어깨에 더 많은 책임을 질 수 있다고 생각한다. –

관련 문제