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.