# JPA Entities — Spring Boot

Source: https://www.skillbyai.com/en/spring-boot/j-entity

> Classes mapped to tables.

## @Entity, @Id and Hibernate

An `@Entity` class maps to a table; `@Id` marks the primary key and `@GeneratedValue` lets the database generate it. JPA (implemented by **Hibernate**) needs a no-argument constructor (it can be protected) and tracks loaded entities in a persistence context, writing changes at commit. In production, manage the schema with migrations (Flyway or Liquibase) rather than `ddl-auto=create-drop`, which the demo uses only for an in-memory database.

## Entities, repositories, transactions

JPA maps classes to tables, Spring Data generates repositories, and transactions keep changes consistent.

![Three ideas: entities, repositories, transactions.](assets/figures/spring-boot/section-4-map.svg) — Figure 4.1 — Entities, repositories and transactions.

## The Product entity

This file is from a demo "shop" service generated by start.spring.io for Spring Boot 4.1.1 and Java 21 (Temurin 21.0.12), built with Maven 3.9.16; the project compiled and its tests passed. A minimal entity with a generated id, a protected no-args constructor for JPA, and getters.

```java
package com.example.shop;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import java.math.BigDecimal;

@Entity
public class Product {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private BigDecimal price;

    protected Product() { }                          // required by JPA

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

    public Long getId() { return id; }
    public String getName() { return name; }
    public BigDecimal getPrice() { return price; }
}
```

## Use migrations in production

Set ddl-auto to validate (or none) and evolve schemas with Flyway or Liquibase scripts reviewed like code.

**Quiz:** Why does a JPA entity need a no-argument constructor?

- [ ] It is used for validation only
- [ ] Spring forbids other constructors
- [ ] It speeds up queries
- [x] The JPA provider uses it to create instances when loading data

*Answer:* The JPA provider uses it to create instances when loading data. It can be protected to discourage misuse.
