DEV Community

SOVANNARO
SOVANNARO

Posted on

Spring Boot: JPA One-to-One Mapping

Introduction

When working with relational databases in Java, JPA (Java Persistence API) makes it easier to map relationships between entities. One of the most fundamental relationships is One-to-One mapping. In this blog, we'll break it down in a way that makes it simple and enjoyable to learn!

By the end of this article, you'll understand:

  • What One-to-One mapping is.
  • How to implement it in Spring Boot with JPA and Hibernate.
  • The different ways to set up the relationship.
  • Practical use cases for real-world applications.

Let's dive in! πŸš€


What is One-to-One Mapping?

A One-to-One relationship means that one entity is associated with exactly one other entity. For example:

  • A User can have exactly one Profile.
  • A Car can have exactly one Engine.

In database terms, this means that the primary key of one table is linked to the primary key of another table.

How Does One-to-One Mapping Work in JPA?

JPA provides the @OneToOne annotation to define this relationship. There are different ways to implement it, depending on how you design your database:

  1. Using a Foreign Key (Recommended) βœ…
  2. Using a Shared Primary Key πŸ”‘
  3. Using a Join Table πŸ›οΈ

Let's see how we can implement these approaches in Spring Boot!


Implementing One-to-One Mapping in Spring Boot

1️⃣ One-to-One Mapping Using a Foreign Key (Recommended)

The most common way to set up a One-to-One relationship is by using a foreign key. Here’s how we do it:

πŸ“Œ Step 1: Create the User Entity

import jakarta.persistence.*;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

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

    // Getters and Setters
}
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Step 2: Create the Profile Entity

import jakarta.persistence.*;

@Entity
public class Profile {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String bio;
    private String website;

    // Getters and Setters
}
Enter fullscreen mode Exit fullscreen mode

πŸ”Ή In the User entity, we used @OneToOne and @JoinColumn(name = "profile_id") to specify that the profile_id column in the User table acts as a foreign key pointing to the id column in the Profile table.


2️⃣ One-to-One Mapping Using a Shared Primary Key

In this approach, the primary key of one table is also used as the primary key of another table.

πŸ“Œ Update the Profile Entity

@Entity
public class Profile {
    @Id
    private Long id;
    private String bio;
    private String website;

    @OneToOne
    @MapsId
    @JoinColumn(name = "id")
    private User user;
}
Enter fullscreen mode Exit fullscreen mode

πŸ”Ή The @MapsId annotation ensures that the Profile entity shares the same primary key as User.


3️⃣ One-to-One Mapping Using a Join Table

Sometimes, you may want a third table to manage the relationship. In this case, JPA allows us to use @JoinTable.

πŸ“Œ Modify the User Entity

@OneToOne(cascade = CascadeType.ALL)
@JoinTable(name = "user_profile",
           joinColumns = @JoinColumn(name = "user_id"),
           inverseJoinColumns = @JoinColumn(name = "profile_id"))
private Profile profile;
Enter fullscreen mode Exit fullscreen mode

πŸ”Ή This approach creates a user_profile table that holds the user_id and profile_id columns, acting as a bridge between User and Profile.


When to Use One-to-One Mapping?

One-to-One relationships are useful in scenarios where:
βœ… The related data is rarely accessed separately (e.g., user profile information).
βœ… You need data integrity with clear ownership (e.g., a unique identity document per user).
βœ… You want to simplify queries and avoid data duplication.


Conclusion 🎯

In this article, we explored:

  • What One-to-One mapping is.
  • Three ways to implement it in Spring Boot with JPA.
  • When to use each approach.

One-to-One mapping is a powerful way to structure your database relationships effectively. Mastering it will help you build better, more scalable applications! πŸš€

πŸ’¬ Got questions or feedback? Drop a comment below! Happy coding! πŸ˜ƒ

Top comments (0)