0Pricing
Spring Boot 4 Microservices & REST APIs · Lesson

Defining Entities & Repositories

Create JPA entities to map to database tables and define repository interfaces for data access.

Defining Entities & Repositories is a free Spring Boot 4 Microservices & REST APIs lesson on CoddyKit — lesson 4 of 6. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the Spring Boot 4 Microservices & REST APIs learning path, one of 6 lessons in the course, and your progress syncs across the web and the CoddyKit app.

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!

Frequently asked questions

Is the “Defining Entities & Repositories” lesson free?

Yes — the full text of “Defining Entities & Repositories” is free to read here on the web, and the Spring Boot 4 Microservices & REST APIs course includes 6 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the Spring Boot 4 Microservices & REST APIs course, upgrade to CoddyKit PRO.

What will I learn in “Defining Entities & Repositories”?

Create JPA entities to map to database tables and define repository interfaces for data access. You practise Spring Boot 4 Microservices & REST APIs with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.

Do I need any experience to start Spring Boot 4 Microservices & REST APIs?

No prior experience is required. Spring Boot 4 Microservices & REST APIs on CoddyKit is structured for beginners through advanced learners; this is — lesson 4 of 6, so you can start here or from the beginning and move at your own pace.

How long does the “Defining Entities & Repositories” lesson take?

Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.

Can I write and run code in this Spring Boot 4 Microservices & REST APIs lesson?

Yes. Every Spring Boot 4 Microservices & REST APIs lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.

All lessons in this course

  1. Integrating H2 Database & JPA
  2. Introduction to Spring Data JPA
  3. Creating Entities & Repositories
  4. Defining Entities & Repositories
  5. CRUD Operations with REST
  6. Performing CRUD Operations
← Back to Spring Boot 4 Microservices & REST APIs