Рубрики
Без рубрики

Сопоставление данных LOB в режиме гибернации

Узнайте, как сопоставлять данные больших объектов с помощью аннотации Hibernate @Lob.

Автор оригинала: baeldung.

1. Обзор

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

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

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

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

2. Настройка

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


    org.hibernate
    hibernate-core
    5.4.12.Final


    com.h2database
    h2
    1.4.196

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

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

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

Наша модель “Пользователь” имеет идентификатор, имя и фотографию в качестве свойств. Мы сохраним изображение в свойстве User ‘s photo и сопоставим его с большим двоичным объектом:

@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 указывает, что база данных должна хранить свойство как Большой объект . Определение столбца в аннотации @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. Сохраняющийся Крупный Объект

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

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

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

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

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

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