Бер 192016
 

Hibernate: основные типы данных

Hibernate предоставляет ряд готовых решений для привязки и приведения типов данных языка программирования к типам данных SQL. Такой процесс преобразования в Hibernate основан на использовании интерфейса org.hibernate.type.Type, а точнее его конкретных реализаций.

Тип данных в Hibernate нельзя отнести ни к типу данных Java, ни к типу данных SQL. Он представляет собой мост между этими двумя типами, содержит информацию о них обоих одновременно и предоставляет правила для их преобразования. При этом SQL типы представлены абстрактно и их преобразование происходит уже в зависимости от текущего SQL диалекта базы данных. Такой подход представляет собой гибкое решение для подключения различных баз без изменения кода приложения и позволяет не задумываться о типах данных и спецификации SQL, поддерживаемых конкретной базой.

Типы данных в Hibernate разделены на 3 категории: основные типы, составные типы и типы коллекций. В этой статье речь пойдет только об основных типах данных, которые используются для отображения одного поля в БД. Эти типы удовлетворяют большинству потребностей приложения, обеспечивая связь между основными типами Java и распространенными типами SQL.

Основные встроенные типы данных:

Java Class Hibernate Class (org.hibernate.type) Hibernate тип Возможный тип данных SQL¹
¹ Конечный тип зависит от производителя БД
java.lang.String StringType string VARCHAR
(или Oracle VARCHAR2)
MaterializedClob materialized_clob CLOB
TextType text LONGVARCHAR (или TEXT)
java.lang.Character
(or char primitive)
CharacterType char CHAR
java.lang.Boolean
(or boolean primitive)
BooleanType boolean BIT
NumericBooleanType numeric_boolean INTEGER
(0 = false, 1 = true)
YesNoType yes_no CHAR
(‘N’ = false, ‘Y’ = true)
TrueFalseType true_false CHAR
(‘F’ = false, ‘T’ = true)
java.lang.Byte
(or byte primitive)
ByteType byte TINYINT
java.lang.Short
(or short primitive)
ShortType short SMALLINT
java.lang.Integer
(or int primitive)
IntegerType int
integer
INTEGER
java.lang.Long
(or long primitive)
LongType long BIGINT
java.lang.Float
(or float primitive)
FloatType float FLOAT
java.lang.Double
(or double primitive)
DoubleType double DOUBLE
java.math.BigInteger BigIntegerType big_integer NUMERIC
(или Oracle NUMBER)
java.math.BigDecimal BigDecimalType big_decimal NUMERIC
(или Oracle NUMBER)
java.util.Date
java.sql.Timestamp
TimestampType timestamp TIMESTAMP
java.sql.Time TimeType time TIME
java.sql.Date DateType date DATE
java.util.Calendar CalendarType calendar TIMESTAMP
java.util.Calendar CalendarType calendar TIMESTAMP
CalendarDateType calendar_date DATE
java.util.Currency CurrencyType currency VARCHAR
(или Oracle VARCHAR2)
java.util.Locale LocaleType locale VARCHAR
(или Oracle VARCHAR2)
java.util.TimeZone TimeZoneType timezone VARCHAR
(или Oracle VARCHAR2)
java.net.URL UrlType url VARCHAR
(или Oracle VARCHAR2)
java.lang.Class ClassType class VARCHAR
(или Oracle VARCHAR2)
java.sql.Blob BlobType blob BLOB
java.sql.Clob ClobType сlob СLOB
byte[] BinaryType binary (или byte[]) VARBINARY
MaterializedBlobType materialized_blob BLOB
ImageType image LONGVARBINARY
Byte[] WrapperBinaryType wrapper-binary (или Byte[]) VARBINARY
char[] CharArrayType characters (или char[]) VARCHAR
(или Oracle VARCHAR2)
Character[] CharacterArrayType wrapper-characters (или Character[]) VARCHAR
(или Oracle VARCHAR2)
java.util.UUID UUIDBinaryType uuid-binary BINARY
UUIDCharType uuid-char CHAR (или VARCHAR для существующих колонок)
PostgresUUIDType pg-uuid PostgreSQL UUID
java.io.Serializable SerializableType serializable(или имя класса реализующего интерфейс Serializable) VARBINARY

Типы blob и clob не всегда удобны для использования в приложении, потому как эти объекты не могут быть переиспользованы за пределами транзакции. Их альтернативой могут послужить materialized_blob и materialized_clob, эти типы сразу воссоздаются как байтовый массив и строка соответственно, и доступны вне транзакции.

За исключением коллекций, все встроенные типы Hibernate поддерживают null семантику. Уникальные идентификаторы и коллекции могут быть любым из этих типов данных, за исключением binary, blob и clob.

Использование Hibernate типов

Сразу хочу сказать, что для типов данных Java указывать Hibernate типы совсем не обязательно, в этом случае Hibernate подберет и назначит их самостоятельно. Но при использовании типов данных, которые могут быть сопоставлены более чем с одним Hibernate типом, лучше задавать их явно. Например, если свойство имеет тип java.lang.String, то по умолчанию Hibernate промаппит его типом «string». Это означает, что Вы должны явно определить Hibernate тип для свойства, если хотите отобразить строку как «text» или «materialized_clob».

Для определения Hibernate типа используется атрибут type при маппинге с помощью xml файла. Атрибут type может указываться в любых элементах, таких как <id>, <property>, <discriminator>, <index>, или <element>:

<hibernate-mapping>
<class name="User" table="USER">

<id name="id" column="ID" type="long">
<generator class="native"/>
</id>

<property name="birthdate" column="BIRTHDATE" type="timestamp"/>
</class>
</hibernate-mapping>

В случае маппинга с помощью аннотаций используется аннотация

org.hibernate.annotations.Type:

@Type(type = "yes_no")
private boolean newModel;

@Type(type = "text")
private String description;

Если же набора базовых типов не достаточно для реализации задач, Вы всегда можете написать свои собственные типы и назначить собственные стратегии преобразования. Но об этом в следующих статьях.