Spring Data JPA & Hibernate

🌿 Spring BootLesson 5Intermediate

Spring Data JPA drastically reduces the boilerplate of database access. Combined with Hibernate as the JPA provider, it maps Java objects to relational database tables using annotations.

1 Entity Class
Java — User Entity
import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDateTime;

@Entity
@Table(name = "users",
    uniqueConstraints = @UniqueConstraint(columnNames = "email"))
@Getter @Setter @NoArgsConstructor
public class User {

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

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

    @Column(nullable = false, unique = true)
    private String email;

    @Column(name = "password_hash", nullable = false)
    private String passwordHash;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private Role role = Role.USER;

    @Column(name = "is_active")
    private boolean active = true;

    @CreationTimestamp
    @Column(name = "created_at", updatable = false)
    private LocalDateTime createdAt;

    @UpdateTimestamp
    @Column(name = "updated_at")
    private LocalDateTime updatedAt;

    // One user has many posts
    @OneToMany(mappedBy = "author", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Post> posts = new ArrayList<>();
}
2 JPA Relationships
Java — Relationship Annotations
// @ManyToOne — Post belongs to a User
@Entity
public class Post {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "author_id", nullable = false)
    private User author;

    @ManyToMany
    @JoinTable(
        name = "post_tags",
        joinColumns = @JoinColumn(name = "post_id"),
        inverseJoinColumns = @JoinColumn(name = "tag_id")
    )
    private Set<Tag> tags = new HashSet<>();
}

// @OneToOne — User has one Profile
@Entity
public class Profile {
    @Id
    private Long id;

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId  // shares primary key with User
    @JoinColumn(name = "id")
    private User user;

    private String bio;
    private String avatarUrl;
}
3 Code Challenge
Challenge: Create a Product entity with fields: id, name, description, price (BigDecimal), stockQuantity, and a ManyToOne relationship to a Category entity. Enable Hibernate SQL logging and verify the generated DDL matches expectations.