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;
Если же набора базовых типов не достаточно для реализации задач, Вы всегда можете написать свои собственные типы и назначить собственные стратегии преобразования. Но об этом в следующих статьях.