Отображение данных больших объектов в Hibernate

Отображение данных больших объектов в Hibernate

1. обзор

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

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

  • CLOB -Character Large Object будет хранить большие текстовые данные

  • BLOB -Binary Large Object предназначен для хранения двоичных данных, таких как изображение, аудио или видео.

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

2. Настроить

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


    org.hibernate
    hibernate-core
    5.2.12.Final


    com.h2database
    h2
    1.4.196

Последняя версия зависимостей находится вMaven Central Repositories.

Более подробно о настройке Hibernate можно прочитать в одной из наших статей оintroductory.

3. Модель данных LOB

Наша модель“User” имеет в качестве свойств id, name и photo. Мы сохраним изображение в свойстве photoUser и сопоставим его с 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 определяет тип столбца для свойства.

Поскольку мы собираемся сэкономитьbyte array, мы используемBLOB.

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

4.1. Инициировать Hibernate Session

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

Используя вспомогательный класс, мы создадимHibernate Session, используя информацию базы данных, предоставленную в файле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, чтобы сравнить их со вставленными данными.

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

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

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

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, используя ту же информацию сопоставления в аннотациях.

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

5. Заключение

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

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

Как всегда доступен код для этой статьиover on GitHub.