- •Цель работы
- •Теоретическая часть
- •Слоистая архитектура
- •Ключевые понятия
- •Ход выполнения работы
- •Часть 0. Подготовка
- •Часть 1. Подключение Spring Data JPA и PostgreSQL
- •Часть 2. Создание сущностей и перечислений
- •2.1. Создайте перечисления NotificationChannel и NotificationStatus
- •2.2. Создайте сущность User
- •2.3. Создайте сущность Notification
- •Часть 3. Создание DTO и репозиториев
- •3.1. DTO для User
- •3.2. DTO для Notification
- •3.3. Создайте репозитории
- •Часть 4. Реализация CRUD для User
- •4.1. Создайте UserService
- •4.2. Создайте UserController
- •Часть 5. Реализация CRUD для Notification
- •5.1. Создайте NotificationService
- •5.2. Создайте NotificationController
- •5.3. Проверьте работу CRUD-операций для Notification
- •Часть 6. Методы репозитория Spring Data JPA
- •6.1. Запрос по нескольким параметрам
- •6.2. Сортировка в имени метода
- •6.3. Использование @Query
- •Часть 7. Транзакции
- •Часть 8. Проверка работы приложения в Postman
- •Часть 9. Валидация данных
- •Самостоятельные задания
- •Контрольные вопросы
Назначение настроек:
•spring.datasource.url=${DB_URL} — адрес подключения к базе данных. Здесь Spring Boot берет значение из переменной окружения DB_URL .
•spring.datasource.username=${DB_USERNAME} — имя пользователя для подключения
кPostgreSQL.
•spring.datasource.password=${DB_PASSWORD} — пароль пользователя базы данных.
•spring.jpa.hibernate.ddl-auto=update — указывает Hibernate автоматически обновлять структуру таблиц на основе JPA-сущностей. Если таблиц еще нет, они будут созданы. Если поля изменились, Hibernate попытается скорректировать структуру.
•spring.jpa.show-sql=true — включает вывод SQL-запросов в консоль. Это удобно для
наблюдения за тем, какие запросы формирует Hibernate.
•spring.jpa.properties.hibernate.format_sql=true — делает вывод SQL в логах более читаемым, разбивая его на строки и форматируя отступы.
•Создайте структуру пакетов:
org.example ├──controller ├──service ├──repository ├──exception └──model
├──dto
├──entity └──enums
Часть 2. Создание сущностей и перечислений
2.1. Создайте перечисления NotificationChannel и NotificationStatus
package org.example.model.enums;
public enum NotificationChannel { EMAIL,
SMS,
PUSH,
TELEGRAM
}
package org.example.model.enums;
public enum NotificationStatus { CREATED,
SENT,
4
FAILED
}
2.2. Создайте сущность User
package org.example.model.entity;
import jakarta.persistence.*; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.Setter;
import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List;
@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "users") public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@Column(nullable = false) private String name;
private String email;
private String phone;
private String deviceToken;
private String telegramChatId;
private LocalDateTime createdAt;
@OneToMany(mappedBy = "recipient", cascade = CascadeType.ALL) private List<Notification> notifications = new ArrayList<>();
}
2.3. Создайте сущность Notification
package org.example.model.entity;
import jakarta.persistence.*;
5
import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.Setter;
import org.example.model.enums.NotificationChannel; import org.example.model.enums.NotificationStatus;
import java.time.LocalDateTime;
@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "notifications") public class Notification {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@Column(nullable = false) private String title;
@Column(nullable = false, columnDefinition = "TEXT") private String message;
@Enumerated(EnumType.STRING) @Column(nullable = false)
private NotificationChannel channel;
@Enumerated(EnumType.STRING) @Column(nullable = false)
private NotificationStatus status;
private LocalDateTime createdAt;
private LocalDateTime sentAt;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "recipient_id", nullable = false) private User recipient;
}
1.Запустите приложение и убедитесь, что Hibernate автоматически создал таблицы users
и notifications .
6
