0Pricing
Spring Boot 4 Microservices & REST APIs · Урок

Определение сущностей и репозиториев

Создавайте сущности JPA для сопоставления с таблицами базы данных и определяйте интерфейсы репозиториев для доступа к данным

«Определение сущностей и репозиториев» — бесплатный урок Spring Boot 4 Microservices & REST APIs на CoddyKit. Это урок 4 из 6. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Spring Boot 4 Microservices & REST APIs, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Spring Boot 4 Microservices & REST APIs содержит 6 уроков всего.

Части этого урока еще не переведены и отображаются на английском.

Welcome to Data Persistence

In this lesson, we'll learn how to connect your Java application to a database using Spring Boot. This is called data persistence, meaning your data lives on even after your app stops.

We'll focus on two core concepts:

  • Entities: Your Java objects that map to database tables.
  • Repositories: Interfaces that provide easy ways to interact with your entities and the database.

What's a JPA Entity?

A JPA Entity is a plain Java class that represents a table in your relational database. Each instance of this class corresponds to a row in that table.

The Java Persistence API (JPA) is a standard for managing relational data in Java applications. Spring Data JPA builds on this to simplify database interactions even further.

Defining Your First Entity

To mark a Java class as a JPA Entity, you use the @Entity annotation. You also need to define a primary key using @Id.

Let's create a simple Product entity:

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class Product {

    @Id
    private Long id;
    private String name;
    private double price;

    public Product() {}

    public Product(Long id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Product{id=" + id + ", name='" + name + "', price=" + price + "}";
    }

    public static void main(String[] args) {
        Product product = new Product(1L, "Laptop", 1200.00);
        System.out.println(product);
    }
}

Auto-Generating Primary Keys

Manually assigning IDs can be tedious and prone to errors. Databases can automatically generate unique IDs for you!

Use the @GeneratedValue annotation along with a strategy. GenerationType.IDENTITY is common for databases that auto-increment (like MySQL, H2).

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    public Product() {}

    public Product(String name, double price) { // No ID in constructor
        this.name = name;
        this.price = price;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Product{id=" + id + ", name='" + name + "', price=" + price + "}";
    }

    public static void main(String[] args) {
        Product product = new Product("Keyboard", 75.00);
        // In a real app, ID would be generated by the DB when persisted
        System.out.println("Product created (ID will be generated by DB): " + product);
    }
}

Customizing Column Mappings

By default, JPA maps fields to columns with the same name. You can customize this using the @Column annotation.

It lets you specify the column name, whether it's nullable, its length, and more:

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "product_name", nullable = false, length = 100)
    private String name;

    @Column(nullable = false)
    private double price;

    public Product() {}

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Product{id=" + id + ", name='" + name + "', price=" + price + "}";
    }

    public static void main(String[] args) {
        Product product = new Product("Mouse", 25.50);
        System.out.println("Product with custom columns: " + product);
    }
}

Introducing Spring Data Repositories

Now that we have an entity, how do we save it to the database or retrieve it? That's where Spring Data Repositories come in!

A repository is an interface that provides powerful, pre-built methods for common database operations (like Create, Read, Update, Delete - CRUD). You don't write SQL; Spring Data JPA generates it for you.

Defining a JpaRepository Interface

To create a repository for your entity, you simply define an interface that extends Spring Data JPA's JpaRepository.

The JpaRepository takes two type parameters: the Entity type and the type of its Primary Key.

Here's how you'd define a repository for our Product entity:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

// Assuming 'Product' entity is defined in the same package or imported
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
    // Spring Data JPA automatically provides CRUD methods here!
    // You can add custom query methods if needed, e.g.,
    // List<Product> findByName(String name);
}

Note: The @Repository annotation is optional but good practice for clarity.

Built-in Repository Methods

By extending JpaRepository, your ProductRepository automatically inherits many powerful methods. Here are a few:

  • save(entity): Saves a given entity (inserts if new, updates if exists).
  • findById(id): Retrieves an entity by its ID, returning an Optional.
  • findAll(): Returns all instances of the entity type.
  • delete(entity) or deleteById(id): Removes an entity.

This means you get full CRUD functionality without writing a single line of implementation code!

Using Repositories in an App

In a real Spring Boot application, you would inject your repository into a service or controller using @Autowired and then call its methods.

While we can't run a full Spring Boot app with a database here, this snippet shows the conceptual usage within a typical Spring Boot component:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

// Assuming Product and ProductRepository are defined

@Service
public class ProductService {

    private final ProductRepository productRepository;

    @Autowired
    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    public Product createProduct(String name, double price) {
        Product newProduct = new Product(name, price);
        return productRepository.save(newProduct);
    }

    public List<Product> getAllProducts() {
        return productRepository.findAll();
    }

    public Product getProductById(Long id) {
        return productRepository.findById(id).orElse(null);
    }
}

This ProductService would then be used by other parts of your application.

Quick Check on Entities

Which of the following annotations are essential for defining a basic JPA Entity that maps to a database table and has an auto-generated primary key?

Recap: Entities & Repositories

Great job! You've learned the foundations of data persistence with Spring Data JPA:

  • Entities are Java classes annotated with @Entity that map to database tables.
  • @Id marks the primary key, and @GeneratedValue lets the database handle ID generation.
  • @Column allows you to customize field-to-column mappings.
  • Repositories are interfaces that extend JpaRepository<Entity, ID>, providing powerful, ready-to-use CRUD methods without writing SQL.

Next, you'll dive deeper into performing various CRUD operations!

Часто задаваемые вопросы

Урок «Определение сущностей и репозиториев» бесплатный?

Да — полный текст урока «Определение сущностей и репозиториев» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Spring Boot 4 Microservices & REST APIs, подпишись на CoddyKit PRO. Курс Spring Boot 4 Microservices & REST APIs содержит 6 уроков всего.

Чему я научусь в уроке «Определение сущностей и репозиториев»?

Создавайте сущности JPA для сопоставления с таблицами базы данных и определяйте интерфейсы репозиториев для доступа к данным Ты практикуешь Spring Boot 4 Microservices & REST APIs с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Spring Boot 4 Microservices & REST APIs?

Предыдущий опыт не требуется. Spring Boot 4 Microservices & REST APIs на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 6.

Сколько времени занимает урок «Определение сущностей и репозиториев»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Spring Boot 4 Microservices & REST APIs?

Да. Каждый урок Spring Boot 4 Microservices & REST APIs включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Интеграция базы данных H2 и JPA
  2. Введение в Spring Data JPA
  3. Создание сущностей и репозиториев
  4. Определение сущностей и репозиториев
  5. Операции CRUD с REST
  6. Выполнение CRUD-операций
← Назад к Spring Boot 4 Microservices & REST APIs