Skip to main content

Guide to create One to One Mapping in Spring Boot using JPA

One to One Relationship using JPA in Spring Boot Application | Unidirectional and Bidirectional

One to One Relationship using JPA in Spring Boot Application | Unidirectional and Bidirectional

JPA(Java Persistence API) is specification that used object relation mapping to manage relational data in Java application.

In this tutorial, we will see how to create Spring Boot application that uses One to One mapping relation. 

In past tutorial, We had already seen Spring Boot CRUD operation So please check out first for better understanding of one-to-one mapping.

We will use tow entities, User and UserDetails for our tutorial. 

Unidirectional One to One Mapping :

If one persistence object uses other and in back if other is not using the first persistence object then it becomes unidirectional.

@OneToOne mapping uses FetchType.Lazy loading strategy. 

In Unidirectional mapping, we add @OneToOne mapping in only one class. So in User class we annotate UserProfile field with @OneToOne mapping.

User.java

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name = "User")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int userId;
    
    @Column
    private String userName;
    
    @OneToOne
    private UserProfile userProfile;


    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public UserProfile getUserProfile() {
        return userProfile;
    }

    public void setUserProfile(UserProfile userProfile) {
        this.userProfile = userProfile;
    }
}

UserProfile.java

@Entity
@Table(name = "UserProfile")
public class UserProfile {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int userProfileId;
    
    @Column
    private int age;
    
    @Column
    private String country;

    public int getUserProfileId() {
        return userProfileId;
    }

    public void setUserProfileId(int userProfileId) {
        this.userProfileId = userProfileId;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
    
}

When you run application, It will create "user_profile_id" column in User table. It is called foreign key column.

@JoinTable Annotation

Change Foreign Key Column name using @JoinTable

If you want to change name of "user_profile_id" foreign key, @JoinTable annotation is used. @JoinColumn annotation is not mandatory to write.

User.java

    @OneToOne
    @JoinColumn(name = "UserProfile")
    private UserProfile userProfile;

Bidirectional One to One Mapping :

In bidirectional mapping, both entities fields are defined by @OneToOne mapping. 

In User entity, we already created ne-to-one mapping on UserProfile. Now we will also define User field as one-to-one mapping in UserProfile entity.

UserProfile.java    

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

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

After restarting application, UserProfile table display new column, named "user".

MappedBy Property in One-to-One mapping

In Bidirectional, both tables are displaying foreign key. But if we want to display in only any one of the table we can use mappedBy property in @OneToOne annotation. 

Like, If we only want to display User foreign key in UserProfile table, and don't want to display UserProfile foreign key into User table we can simply add @OneToOne(mappedBy = "user") where "user" is filed in UserProfile entity.

User.java

    @OneToOne(mappedBy = "user")  // use field present in UserProfile entity
    @JoinColumn(name = "UserProfile")
    private UserProfile userProfile;

After this User table contains only two columns :

  1. user_id
  2. user_name


Conclusion :

In this tutorial, 

  • We learned how to use @OneToOne mapping in SpringBoot JPA. 
  • We learned how to change foreign key column name using @JoinColumn annotation. 
  • We also seen how to use mappedBy property in @OneToOne annotation for displaying foreign key only in one table not in both.

 

Similar Articles :

Comments

Popular posts from this blog

Sales by Match HackerRank Solution | Java Solution

HackerRank Sales by Match problem solution in Java   Problem Description : Alex works at a clothing store. There is a large pile of socks that must be paired by color for sale. Given an array of integers representing the color of each sock, determine how many pairs of socks with matching colors there are. For example, there are n=7 socks with colors socks = [1,2,1,2,1,3,2]. There is one pair of color 1 and one of color 2 . There are three odd socks left, one of each color. The number of pairs is 2 .   Example 1 : Input : n = 6 arr = [1, 2, 3, 4, 5, 6] Output : 0 Explanation : We have 6 socks with all different colors, So print 0. Example 2 : Input : n = 10 arr = [1, 2, 3, 4, 1, 4, 2, 7, 9, 9] Output : 4 Explanation : We have 10 socks. There is pair of color 1, 2, 4 and 9, So print 4. This problem easily solved by HashMap . Store all pair of socks one by one in Map and check if any pair is present in Map or not. If pair is present then increment ans variable by 1 ...

Queen's Attack II HackerRank Solution in Java with Explanation

Queen's Attack II Problem's Solution in Java (Chessboard Problem)   Problem Description : You will be given a square chess board with one queen and a number of obstacles placed on it. Determine how many squares the queen can attack.  A queen is standing on an n * n chessboard. The chess board's rows are numbered from 1 to n, going from bottom to top. Its columns are numbered from 1 to n, going from left to right. Each square is referenced by a tuple, (r, c), describing the row r and column c, where the square is located. The queen is standing at position (r_q, c_q). In a single move, queen can attack any square in any of the eight directions The queen can move: Horizontally (left, right) Vertically (up, down) Diagonally (four directions: up-left, up-right, down-left, down-right) The queen can move any number of squares in any of these directions, but it cannot move through obstacles. Input Format : n : The size of the chessboard ( n x n ). k : The number of obstacles...