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

Маппинг классов в Hibernate

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

2.1 Аннотация @Entity, @Table

Если ты хочешь замапить свой класс на таблицу в базе данных, то для этого нужно добавить в него целых 3 аннотации.

Во-первых, нужно добавить к классу аннотацию @Entity. Эта аннотация перед классом укажет Hibernate, что это не просто класс, а специальный класс, объекты которого нужно хранить в базе данных.

Пример:


@Entity
class User {
    public int id;
    public String name;
    public int level;
    public Date createdDate;
}

Этого достаточно, чтобы Hibernate по-особому обращался с объектами этого класса.

Вторая аннотация — @Table. С ее помощью можно задать имя таблицы в базе, с которой будет связан данный класс. Пример:


@Entity @Table(name="user")
class User {
    public int id;
    public String name;
    public int level;
    public Date createdDate;
}

Если имя класса и имя таблицы совпадают, то аннотацию @Table можно не указывать.

Также если твое приложение работает с таблицами из нескольких схем одновременно, то нужно указать, в какой конкретно схеме находится таблица:


@Entity @Table(name="user", schema="test")
class User {
    public int id;
    public String name;
    public int level;
    public Date createdDate;
}

Да, все так просто, как кажется.

2.2 Аннотация @Column

Второй важный момент, который нужно знать — это маппинг колонок таблицы на поля класса. В самом простом варианте Hibernate просто сам замапит поля твоего entity-класса на колонки нужной таблицы.

Если же ты хочешь контролировать все нюансы маппинга, то можешь воспользоваться аннотацией @Column. Пример:


@Entity @Table(name="user")
class User {
   @Column(name="id")
   public Integer id;
 
   @Column(name="name")
   public String name;
 
   @Column(name="level")
   public Integer level;
 
   @Column(name="created_date")
   public Date createdDate;
}

У аннотации @Column есть различные параметры, ниже мы рассмотрим самые популярные из них:

# Имя атрибута Тип атрибута Описание
1 name String Задает имя колонки таблицы для поля класса
2 unique boolean Все значения поля должны быть уникальны
3 nullable boolean Поле может принимать значение null
4 length int Максимальная длина (для строк)

Давай добавим несколько ограничений на поля нашего Entity-класса User:

  • имя пользователя должно быть уникально и не длиннее 100 символов
  • level может быть null
  • createdDate не может быть null

Тогда наши аннотации станут такими:


@Entity @Table(name="user")
class User {
   @Column(name="id")
    public Integer id;
 
   @Column(name="name", unique=true, length=100)
   public String name;
 
   @Column(name="level", nullable=true)
   public Integer level;
 
   @Column(name="created_date", nullable=false)
   public Date createdDate;
}

Ты можешь создать объект типа User и даже присвоить ему все поля null, однако при попытке сохранить его в базу данных Hibernate выполнит проверку, и если какие-то ограничения нарушены, то кинется исключение.

2.3 Аннотация @Id

И еще одна важная аннотация — это @Id. С ее помощью можно задать первичный ключ для таблицы.

Нужно просто указать данную аннотацию у нужного поля — и Hibernate сам все сделает:


@Entity @Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;
 
   @Column(name="name")
   public String name;
 
   @Column(name="level")
   public Integer level;
 
   @Column(name="created_date")
   public Date createdDate;
}

Если ты хочешь, чтобы Hibernate самостоятельно генерировал ID твоих объектов при добавлении их в базу, то нужно добавить еще одну аннотацию — @GeneratedValue. Тогда наш пример будет выглядеть так:


@Entity @Table(name="user")
class User {
   @Id
   @GeneratedValue
   public Integer id;
 
   @Column(name="name")
   public String name;
 
   @Column(name="level")
   public Integer level;
 
   @Column(name="created_date")
   public Date createdDate;
}

Мы тут опустили аннотацию @Column для поля id, так как она не несет ценной информации — имя поля и имя колонки в таблице совпадают, а благодаря остальным аннотациям Hibernate и так понимает, что речь идет о колонке таблице.


Короткий разбор: Зачем нужны ID в JPA сущностях?

Статья из видео

1
Задача
Модуль 4. Работа с БД, 9 уровень, 1 лекция
Недоступна
task0901
Добавить зависимость в pom-файл на mysql-connector-java и hibernate-core. Необходимо указать groupId, artifactId и version для каждой из этих зависимостей. Используй версии: mysql-connector-java: 8.0.30 hibernate-core-jakarta: 5.6.11.Final
1
Задача
Модуль 4. Работа с БД, 9 уровень, 1 лекция
Недоступна
Entity
Подключи зависимости в проект. Для этого Alt + Ctrl + Shift + S (в Идее), вкладка Libraries. Зависимости можно скачать здесь: https://javarush.ru/downloads/ide/javarush/hibernate.zip
Комментарии (12)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Валерий кривой Уровень 8
26 октября 2025
⚙️ Основные стратегии генерации ID: AUTO – выбор за JPA провайдером (часто неоптимально). IDENTITY – БД сама назначает ID (MySQL и др.). ✅ Простая, надежная. ❌ Нельзя делать batch-вставки → медленнее. SEQUENCE – используется объект sequence в БД. ✅ Самая производительная стратегия. ⚙️ Можно настраивать через @SequenceGenerator ⚠️ Потенциальные проблемы при множестве клиентов к одной БД. TABLE – эмуляция через таблицу, ❌ худшая по производительности.
Arseniy Rigin Уровень 1 Expert
3 августа 2024
если есть проблемы с импортом некоторых классов , чистите мавник
Иван Корниенко Уровень 109
31 июля 2024
Красота
Андрей Уровень 37 Expert
2 декабря 2023
Минимум нужно всего две аннотации. Это @Entity и @Id. Причем @Id можно ставить только на типами данных содержащий интерфейс Serializable, поэтому над простыми типами такую аннотацию не поставишь...
Михаил Шапошников Уровень 1 Expert
8 апреля 2024
В JPA первичный ключ сущности должен быть объектом, способным к сериализации, что важно для распределенных систем, где сущности могут передаваться в сериализованной форме. Примитивные типы данных (int, long, double и т.д.) сами по себе не являются Serializable, потому что Serializable — это интерфейс, который реализуют объекты классов. Однако обертки примитивных типов (Integer, Long, Double и т.д.), которые являются классами, реализуют интерфейс Serializable. Поэтому, если первичный ключ является примитивным типом, JPA и Hibernate могут автоматически упаковать примитив в его объектную обертку для сериализации.
Dmitriy Уровень 95 Expert
17 сентября 2023
Хотелось бы информацию по использованию составного первичного ключа
Mitrus Latovous Уровень 41
29 ноября 2023
Посмотри в сторону @EmbeddedId
1 сентября 2023
У відео помилка, бо він каже що sequence один на всю БД, хоча зазвичай кожна таблиця має свію послідовність. А тому випадку що він каже, то у різних таблиць була б навскрізна нумерація, десь записи 1-3, десь 4-5, десь 6-7. Також можу зазначити, що Identity не буде працювати коли у вас є BaseEntity від якої унаслідувані усі сутності, тут тільки як мені відомо можна конфігурувати через саму Sequence для кожноъ окремої таблиці.
Зепп Бранниган Уровень 1 Moderator
6 сентября 2023
Будемо вдячні, якщо Ви вкажете тайм-код. Ми перевіримо.
AnnaVin Уровень 47
14 июня 2023
Касательно дат, можно посмотреть тут : https://www.baeldung.com/hibernate-date-time
SchlechtGut Уровень 51
15 июня 2023
касательно всего можно посмотреть на baeldung)))
Anton Martov Уровень 27
18 марта 2023
Отличная лекция! Спасибо!