2010-01-05 3 views
2

나는이 같은 최대 절전 모드 사용자 유형 뭔가가 :최대 절전 모드 UserType을하고 길이가 정의

public class UUIDHibernateType implements UserType 
{ 
    private static final int[] SQL_TYPES = new int[] { Types.CHAR }; 

    public int[] sqlTypes() 
    { 
     return SQL_TYPES; 
    } 

    // ... 
} 

I는 한 문제, 즉 최대 절전 모드는 유형 SQL 스크립트 생성을 CHAR (1) 정확하지 않은, I 실제로 CHAR (36)가 필요합니다. 사용자 정의 유형의 기본 길이는 어떻게 정의합니까?

<id name="id" 
    type="org.openscada.ae.server.storage.jdbc.internal.UUIDHibernateType"> 
    <column name="ID" length="36" sql-type="CHAR(36)" not-null="true" /> 
    <generator class="assigned" /> 
</id> 

그것은이 경우에는 문제가되지 않습니다,하지만 필요시 내가 어떻게 할 것입니다 : 순간

나는이 같은 SQL-유형을 정의와 붙어있어

?

추 신 : 누군가가 UUID를 투명하게 처리하고 데이터베이스를 관리하는 방법에 대해 더 잘 알고 있다면 감사드립니다.

답변

0

Hibernate의 내장형 UUID 생성기를 사용하는 것이 좋습니다 (the docs 참조). Hibernate는 PK 열의 정확한 매핑과 크기 등을 알아 내야한다.

+0

이것은 옵션이 아닙니다. 객체를 저장하기 전에 생성해야하기 때문에 ID를 직접 제공해야합니다 (실제 저장은 비동기 적으로 발생합니다). – Mauli

+0

그런 경우 UUID 생성기의 소스 코드에서 열 크기를 지정하는 방법을 살펴보십시오. –

+0

그 아이디어는 분명 합니다만, 나는 보겠습니다. 그러나 uuids와 guids가 모든 데이터베이스에서 기본적으로 사용 가능하지 않기 때문에 각 언어 구현에서 어딘가에 찾을 것입니다. – Mauli

0

UserType.sqlTypes에 의해 반환 된 코드는 Dialect에서 등록 된 형식을 조회하는 데 사용됩니다. 따라서 sqlTypes가 이미 사용되지 않는 코드를 반환하면 Dialect를 서브 클래스 화하고 그 코드를 char (36)로 등록 할 수 있습니다. 예 :

// 사용자 정의 유형 public int [] sqlTypes() { return new int [] {1337}; } 사용자 정의 방언 registerColumnType에서

// (1337, "문자 (36)") 나는 그것을 시도하지 않은,하지만이 최대 절전 모드 포럼에서 작동하도록보고 된 것

.

+0

은 원칙적으로 좋지만, 사용자 (implementor)가 매핑을 전혀 염려하지 않고 자신의 방언을 지정할 수 있어야하므로 방언을 서브 클래 싱 할 수 없습니다. 하지만 세션 팩터 리에서이 유형을 추가 할 수 있는지 살펴볼 것입니다. – Mauli

0

UUID가 데이터베이스에 표시되는 방식에 신경 쓰지 않으면 UUID를 UserType의 BigInteger (java.sql.Types.BIGINT)에 매핑 할 수도 있습니다 (이 경우에는 베이스 10).