Logo

dev-resources.site

for different kinds of informations.

Understanding JPA Mappings in Spring Boot: One-to-One, One-to-Many, Many-to-One, and Many-to-Many Relationships

Published at
8/13/2024
Categories
springboot
jpa
hibernate
java
Author
akashdeep
Categories
4 categories in total
springboot
open
jpa
open
hibernate
open
java
open
Author
9 person written this
akashdeep
open
Understanding JPA Mappings in Spring Boot: One-to-One, One-to-Many, Many-to-One, and Many-to-Many Relationships

When building applications with Spring Boot and JPA (Java Persistence API), managing relationships between entities is crucial. Understanding how to map these relationships effectively will help you model your data accurately and perform efficient queries. In this guide, we'll explore the different types of JPA mappings supported by Spring Boot: one-to-one, one-to-many, many-to-one, and many-to-many. Will provide example on both unidirectional and bidirectional mappings.

One-to-One Relationship

Unidirectional One-to-One

In a unidirectional one-to-one relationship, one entity references another without the second entity knowing about the first.

Example:

// User.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Data
@Entity
public class User {
    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String username;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "fk_profile_id", referencedColumnName = "id")
    private Profile profile;

}

// Profile.java
import javax.persistence.Entity;
import javax.persistence.Id;

@Data
@Entity
public class Profile {
    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String bio;
}

Enter fullscreen mode Exit fullscreen mode

Bidirectional One-to-One

In a bidirectional one-to-one relationship, both entities reference to each other.

Example:

// User.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Data
@Entity
public class User {
    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String username;

    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
    private Profile profile;

}

// Profile.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.JoinColumn;

@Data
@Entity
public class Profile {
    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String bio;

    @OneToOne
    @JoinColumn(name = "user_id")
    private User user;
}


Enter fullscreen mode Exit fullscreen mode

One-to-Many Relationship

Unidirectional One-to-Many

In a unidirectional one-to-many relationship, one entity references a collection of another entity.

Example:

// Author.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.List;

@Entity
@Data
public class Author {
    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "fk_book_id", referencedColumnName = "id")
    private List<Book> books;
}

// Book.java
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
@Data
public class Book {
    @Id
    private Long id;
    private String title;
}

Enter fullscreen mode Exit fullscreen mode

Bidirectional One-to-Many

In a bidirectional one-to-many relationship, both entities are referenced to each other.

Example:

// Author.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.CascadeType;
import javax.persistence.FetchType;
import java.util.List;

@Entity
@Data
public class Author {
    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "author", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Book> books;

}

// Book.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
@Data
public class Book {
    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String title;

    @ManyToOne(name = "fk_author_id", referencedColumnName = "id")
    private Author author;
}

Enter fullscreen mode Exit fullscreen mode

Many-to-One Relationship

Unidirectional Many-to-One

In a unidirectional many-to-one relationship, multiple entities reference a single entity.

Example:

// Order.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
@Data
public class Order {
    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String description;

    @ManyToOne
    private Customer customer;

}

// Customer.java
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
@Data
public class Customer {

    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String name;

}

Enter fullscreen mode Exit fullscreen mode

Bidirectional Many-to-One

In a bidirectional many-to-one relationship, the referenced entity has a collection of the referring entities.

Example:

// Order.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
@Data
public class Order {

    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String description;

    @ManyToOne
    private Customer customer;

}

// Customer.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.List;

@Entity
@Data
public class Customer {
    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "customer")
    private List<Order> orders;

}

Enter fullscreen mode Exit fullscreen mode

Many-to-Many Relationship

Unidirectional Many-to-Many

In a unidirectional many-to-many relationship, each entity has a collection of the other, but the relationship is not explicitly managed by either side.

Example:

// Student.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;

@Entity
@Data
public class Student {
    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String name;

    @ManyToMany
    private Set<Course> courses;

}

// Course.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;

@Entity
@Data
public class Course {
    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String title;

    @ManyToMany
    private Set<Student> students;
}

Enter fullscreen mode Exit fullscreen mode

Bidirectional Many-to-Many

In a bidirectional many-to-many relationship, both entities are referencing each other, and the relationship is explicitly managed.

Example:

// Student.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;

@Entity
@Data
public class Student {
    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String name;

    @ManyToMany(mappedBy = "students")
    private Set<Course> courses;
}

// Course.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;

@Entity
@Data
public class Course {
    @Id
    @GeneratedValue(stratergy = GenerationType.Identity)
    private Long id;
    private String title;

    @ManyToMany
    private Set<Student> students;
}

Enter fullscreen mode Exit fullscreen mode
jpa Article's
30 articles in total
Favicon
Learn Spring Data JPA, Part - 1
Favicon
Spring Data JPA: Speed Up Development & Business Focus
Favicon
Unidirectional associations for one-to-many
Favicon
Understanding Database Connection Management in Spring Boot with Hibernate and Spring Data JPA
Favicon
Como eu reduzi em até 99% o tempo de resposta da minha API
Favicon
🐾 Hibernate Zoo: Путеводитель по языкам запросов в мире данных 🐾
Favicon
How To Fetch Data By Using DTO Projection In Spring Data JPA
Favicon
Relationships in JPA: Creating Entities Without Dependency
Favicon
Spring Data JPA Stream Query Methods
Favicon
Differences between JpaRepository and CrudRepository and when you need to chose each
Favicon
Understanding JPA Pessimistic Locking vs. Serializable Isolation in Transactions
Favicon
Uma breve introdução ao Hibernate
Favicon
Connecting Spring Boot Applications to a Database with Spring Data JPA
Favicon
Working with Spring Data JPA: CRUD Operations and Beyond
Favicon
The Importance of Using Interfaces for JpaRepository(Java Persistence API) in Spring Data JPA
Favicon
GitHub Mastery: Creating Repositories and Managing PRs with Ease
Favicon
Spring Boot Common Sense: Part 2 Crafting Effective JPA Entities for Robust Data Models
Favicon
Applying JSON Patch to Entity in a Spring Boot Application: A Practical Guide
Favicon
Entendendo @MappedSuperclass em JPA
Favicon
Como iniciar um aplicativo Spring Boot + JPA + MySQL
Favicon
Understanding JPA Mappings in Spring Boot: One-to-One, One-to-Many, Many-to-One, and Many-to-Many Relationships
Favicon
Configurando o Spring com JPA e Microsoft SQL Server
Favicon
Java Hibernate vs JPA: Rapid review for you
Favicon
Database Integration with Spring Boot : Best Practices and Tools
Favicon
what is JPA? explain few configurations
Favicon
Introducing Stalactite ORM
Favicon
How to deal with N+1 problems with Hibernate
Favicon
Jakarta Persistence API (JPA) example application: Northwind sample database
Favicon
spring JPA entities: cheat sheet
Favicon
Java Hibernate vs JPA: Quick Review

Featured ones: