Перейти к основному содержимому

Сопоставление данных LOB в Hibernate

· 3 мин. чтения

1. Обзор

LOB или Large OBject относится к типу данных переменной длины для хранения больших объектов.

Тип данных имеет два варианта:

  • CLOB — Большой объект символов будет хранить большие текстовые данные.
  • BLOB — большой двоичный объект для хранения двоичных данных, таких как изображения, аудио или видео.

В этом руководстве мы покажем, как мы можем использовать Hibernate ORM для сохранения больших объектов.

2. Настройка

Например, мы будем использовать Hibernate 5 и базу данных H2. Поэтому мы должны объявить их как зависимости в нашем pom.xml:

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.12.Final</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.196</version>
</dependency>

Последняя версия зависимостей находится в центральных репозиториях Maven .

Для более подробного ознакомления с настройкой Hibernate обратитесь к одной из наших вводных статей.

3. Модель бизнес-данных

Наша модель «Пользователь» имеет идентификатор, имя и фотографию в качестве свойств. Мы сохраним изображение в свойстве photo пользователя и сопоставим его с BLOB:

@Entity
@Table(name="user")
public class User {

@Id
private String id;

@Column(name = "name", columnDefinition="VARCHAR(128)")
private String name;

@Lob
@Column(name = "photo", columnDefinition="BLOB")
private byte[] photo;

// ...
}

Аннотация @Lob указывает , что база данных должна хранить свойство как Large Object . Параметр columnDefinition в аннотации @Column определяет тип столбца для свойства.

Поскольку мы собираемся сохранить массив байтов , мы используем BLOB.

4. Использование

4.1. Инициировать сеанс гибернации

session = HibernateSessionUtil
.getSessionFactory("hibernate.properties")
.openSession();

Используя вспомогательный класс, мы построим сеанс Hibernate , используя информацию базы данных, предоставленную в файле hibernate.properties .

4.2. Создание экземпляра пользователя

Предположим, что пользователь загружает фотографию в виде файла изображения:

User user = new User();

InputStream inputStream = this.getClass()
.getClassLoader()
.getResourceAsStream("profile.png");

if(inputStream == null) {
fail("Unable to get resources");
}
user.setId("1");
user.setName("User");
user.setPhoto(IOUtils.toByteArray(inputStream));

Мы преобразуем файл изображения в массив байтов с помощью библиотеки Apache Commons IO и, наконец, назначаем массив байтов как часть вновь созданного объекта User .

4.3. Сохраняющийся большой объект

Сохранив User с помощью Session , Hibernate преобразует объект в запись базы данных:

session.persist(user);

Из-за аннотации @Lob, объявленной в классе User , Hibernate понимает, что свойство «photo» должно храниться как тип данных BLOB .

4.4. Проверка данных

Мы извлечем данные обратно из базы данных и с помощью Hibernate сопоставим их с объектом Java , чтобы сравнить их с вставленными данными.

Поскольку мы знаем вставленный идентификатор пользователя , мы будем использовать его для извлечения данных из базы данных: ``

User result = session.find(User.class, "1");

Давайте сравним результат запроса с входными данными пользователя :

assertNotNull(
"Query result is null",
result);

assertEquals(
"User's name is invalid",
user.getName(), result.getName() );

assertTrue(
"User's photo is corrupted",
Arrays.equals(user.getPhoto(), result.getPhoto()) );

Hibernate сопоставит данные в базе данных с объектом Java , используя ту же информацию о сопоставлении в аннотациях.

Поэтому извлеченный объект пользователя будет иметь ту же информацию, что и вставленные данные.

5. Вывод

LOB — это тип данных для хранения данных больших объектов. Есть две разновидности LOB , которые называются BLOB и CLOB . BLOB предназначен для хранения двоичных данных, а CLOB — для хранения текстовых данных.

Используя Hibernate , мы продемонстрировали, как довольно легко отображать данные в объекты Java и из них , если мы определяем правильную модель данных и соответствующую структуру таблицы в базе данных.

Как всегда, код этой статьи доступен на GitHub.