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.