Hibernate UserType и определенной длины - PullRequest
2 голосов
/ 05 января 2010

У меня есть Hibernate Usertype примерно так:

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

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

    // ...
}

У меня проблема в том, что Hibernate генерирует сценарий sql с типами CHAR (1), что не правильно, мне действительно нужно CHAR(36).Как бы определить длину по умолчанию для пользовательского типа?

На данный момент я застрял с определением типа sql следующим образом:

<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>

Это не должно быть проблемойв этом случае, но как бы я это сделал, если возникнет такая необходимость?

PS: Если у кого-то есть идея, как прозрачно обрабатывать UUID и агентировать базу данных, я благодарен.

Ответы [ 3 ]

0 голосов
/ 05 января 2010

Код, возвращаемый UserType.sqlTypes, используется в диалекте для поиска зарегистрированного типа. Таким образом, если у вас есть sqlTypes, возвращающий код, который еще не используется, вы можете создать подкласс вашего диалекта и зарегистрировать этот код как символ (36). Например:

// в вашем пользовательском типе public int [] sqlTypes () { вернуть новый int [] {1337}; }

// на вашем собственном диалекте registerColumnType (1337, "char (36)")

Я не пробовал, но сообщалось, что он работает на форумах Hibernate.

0 голосов
/ 17 апреля 2014

Вы также можете сопоставить свой UUID с BigInteger (java.sql.Types.BIGINT) в вашем UserType, если вам не важно, как ваш UUID представлен в вашей базе данных (в этом случае он будет представлен в базе 10).

0 голосов
/ 05 января 2010

Предлагаю использовать встроенный UUID-генератор Hibernate (см. Документы ). После этого Hibernate должен определить правильное отображение, размер и т. Д. Столбца PK.

...