JavaRush /Курсы /Модуль 4. Работа с БД /Маппинг объектов

Маппинг объектов

Модуль 4. Работа с БД
12 уровень , 5 лекция
Открыта

6.1 Храним файлы на сервере

Иногда в базу данных нужно сохранить бинарные объекты. Например, файлы. Если файл большой, то разумнее всего хранить его в отдельной папке на диске, а в базе данных хранить его пути. Пример:

c:\db-files\users\12355\avatar.jpg

И в базе храним просто относительный путь к файлу:

\12355\avatar.jpg

В базе удобно хранить относительный путь, так как из него потом легко получить URL:

https://storage.javarush.ru/users/12355/avatar.jpg

Мы просто приклеиваем относительный путь к имени сервера и готово.

6.2 Храним картинки прямо в базе

Однако, если картинки маленькие, их можно хранить прямо в базе и отдавать клиенту как набор байт. Для таких случаем в SQL есть специальный тип данных BLOB – Binary Large Object. Вернее, их даже два:

  • CLOB – Character Large Object,
  • BLOB – Binary Large Object.

CLOB используется для хранения очень больших текстов. А 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 подсказывает Hibernate, что в поле хранится Large Object. А columnDefinition="BLOB" уже говорит о том, как это все сохранить в базе.

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


byte[] imageBuffer = Files.readAllBytes(Paths.get("C:/temp/avatar.png"))
 
User user = new User();
user.setId("1");
user.setName("Zapp");
user.setPhoto(imageBuffer);
 
session.persist(user);

6.3 XML и JSON

Hibernate имеет интересную поддержку JSON в качестве типа данных. Он позволяет сохранить HashMap строк в виде единого JSON-объекта. Если СУБД умеет работать с JSON, то выглядит это так:


@JdbcTypeCode(SqlTypes.JSON)
private Map<String, String> properties;

Hibernate берет на себя заботу, чтобы объект типа Map<String, String> был сериализован в единый JSON-объект. Также при чтении объекта из базы превращает JSON-объект в набор Map<String, String>.

Нечто похожее Hibernate может проделать и с XML:


@JdbcTypeCode(SqlTypes.SQLXML)
private Map<String, String> properties;
1
Задача
Модуль 4. Работа с БД, 12 уровень, 5 лекция
Недоступна
Сохранить аудио файл в БД
Если ранее не подключал зависимости, то подключи их. Для этого используй Alt + Ctrl + Shift + S (в Идее), вкладка Libraries. Зависимости можно скачать здесь: https://javarush.com/downloads/ide/javarush/hibernate.zip Архив распакуй, и каждую зависимость добавь к модулю. Эта часть задания не проверяется, но если ее не выполнить, ты не сможешь локально выполнять код.
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Мая Уровень 82
1 ноября 2025
Может кому поможет: "Аннотация @JdbcTypeCode(SqlTypes.JSON) используется в Hibernate для указания, что атрибут объекта должен быть сопоставлен со столбцом типа JSON в базе данных. Она говорит фреймворку, как сериализовать и десериализовать данные (например, из Map) в формате JSON, чтобы сохранить их в базе данных, используя соответствующий тип столбца для конкретной СУБД (например, JSON или JSONB). Назначение:Сообщает Hibernate, что нужно использовать тип данных JSON для данного поля. Сериализация/Десериализация: Hibernate будет использовать стандартную JSON-библиотеку для преобразования объекта в формат JSON при сохранении и обратно при извлечении из базы данных. Связь с базой данных: Аннотация использует внутренний код JDBC SqlTypes.JSON для указания на тип столбца в реляционной базе данных, который поддерживает хранение данных в формате JSON. "
Руслан Уровень 115
18 июля 2024
Сделал задачу с зависимостями: org.hibernate.orm:hibernate-core:6.5.2.Final io.hypersistence:hypersistence-utils-hibernate-62:3.6.1 Чтобы работать с файлом JSON нужно в поле прописать следующее: @Column(name = "file_properties", columnDefinition = "JSON") @Type(JsonType.class)
Andrew Cooper Уровень 1 Expert
13 ноября 2023
как всегда одно и тоже - в лекции объясняются одни аннотации, в задаче совсем другие... ну а с задачей эти клоуны переплюнули сами себя - в задаче, где надо вставить локальный файл для тестирования они пишут ошибку "Превышен допустимый размер файлов". Вы мои герои! Шах и мат, задача с легкой руки становится нерешаемой... Перебрал файлы в меньшую сторону до 1,15Кб и уже даже не представляю где они видели аудио-файл меньшего размера 💩 но тут да, вы смогли удивить своими косяками за долгое время...
Владимир Уровень 108
31 мая 2023
в лекции упущена требуемая в задаче аннотация TypeDef
BlackGrizzli Team Уровень 46
1 марта 2023
Вот так будет выглядеть таблица используя

@JdbcTypeCode(SqlTypes.SQLXML)
А вот так

 @JdbcTypeCode(SqlTypes.JSON)
Не толко Map<String,String> как может показаться из лекции Нужны зависимости

 <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.14.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.14.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.14.2</version>
    </dependency>
Max Dudin Уровень 6 Expert
10 октября 2023
а где в этих заачах использунтся pom файл, / куда добавлять зависимости?
Караганов Михаил Уровень 108 Expert
25 января 2023
@JdbcTypeCode(SqlTypes.JSON) такая аннотация не находится для mysql
Джама Уровень 108 Expert
6 января 2023
XML & JSON в обоих примерах аннотация одна и та же. Для XML должна быть @JdbcTypeCode( SqlTypes.XML)