Spring Data JPA & Hibernate
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.