← Back to Questions
Spring Boot

What is @ManyToOne mapping?

Learn What is @ManyToOne mapping? with simple explanations, real-time examples, interview tips and practical use cases.

What is @ManyToOne Mapping in JPA?

@ManyToOne is a JPA annotation used to define a many-to-one relationship between two entity classes.

It means:

β€œMany records in one table can be associated with one record in another table.”

In simple words:

  • Many child entities β†’ One parent entity
  • Many database rows β†’ One related row

Real-Life Example of Many-to-One Relationship

Common examples:

  • Many employees belong to one department
  • Many orders belong to one customer
  • Many students belong to one college

Database Example

departments Table

id department_name
1 IT

employees Table

id employee_name department_id
101 Naresh 1
102 Kumar 1

Here:

  • Many employees belong to one department
  • One department contains many employees

Why @ManyToOne Mapping is Needed

Without relationship mapping:

  • Developers must manually write JOIN queries
  • Object relationships become difficult
  • Complex SQL code increases

@ManyToOne simplifies:

  • Relationship handling
  • Database joins
  • Object navigation
  • Automatic fetching

Basic @ManyToOne Example

Employee Entity

@Entity
public class Employee {

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

    private String employeeName;

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
}

Department Entity

@Entity
public class Department {

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

    private String departmentName;
}

What Does @JoinColumn Mean?

@JoinColumn specifies the foreign key column used for the relationship.


Example

@JoinColumn(name = "department_id")

means:

department_id

is the foreign key column in the employees table.


Generated Database Structure

employees Table

CREATE TABLE employees (

    id BIGINT PRIMARY KEY,

    employee_name VARCHAR(255),

    department_id BIGINT,

    FOREIGN KEY (department_id)
    REFERENCES departments(id)

)

How @ManyToOne Works Internally

  1. Hibernate detects relationship annotations
  2. Foreign key mapping is created
  3. JOIN queries are generated automatically
  4. Related parent entity is fetched when required

Saving Many-to-One Data

Department department = new Department();

department.setDepartmentName("IT");

Employee employee = new Employee();

employee.setEmployeeName("Naresh");

employee.setDepartment(department);

employeeRepository.save(employee);

Generated SQL Example

INSERT INTO departments(department_name)
VALUES ('IT');

INSERT INTO employees(employee_name, department_id)
VALUES ('Naresh', 1);

Fetch Data Example

Employee employee =
        employeeRepository.findById(1L).get();

System.out.println(
        employee.getDepartment()
                .getDepartmentName()
);

Bidirectional Relationship Example

@ManyToOne is commonly used with:

@OneToMany

Department Entity

@Entity
public class Department {

    @Id
    private Long id;

    @OneToMany(mappedBy = "department")
    private List<Employee> employees;
}

Employee Entity

@Entity
public class Employee {

    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
}

What Does mappedBy Mean?

mappedBy specifies:

  • The inverse side of the relationship
  • Which entity owns the relationship

Owning Side vs Inverse Side

Type Description
Owning Side Contains @JoinColumn
Inverse Side Contains mappedBy

Default Fetch Type

The default fetch type for:

@ManyToOne

is:

FetchType.EAGER

EAGER Fetch Example

@ManyToOne(fetch = FetchType.EAGER)

Related parent entity loads immediately.


LAZY Fetch Example

@ManyToOne(fetch = FetchType.LAZY)

Related entity loads only when accessed.


EAGER vs LAZY Fetching

Feature EAGER LAZY
Loading Time Immediate On demand
Performance Can be slower Usually better
Memory Usage Higher Lower

Cascade Types in @ManyToOne

Cascade operations apply persistence actions automatically.


Cascade Example

@ManyToOne(
    cascade = CascadeType.ALL
)

Advantages of @ManyToOne Mapping

  • Simplifies relationships
  • Automatic JOIN queries
  • Easy navigation between entities
  • Reduces manual SQL code
  • Improves maintainability

Disadvantages of Improper Mapping

  • N+1 query problem
  • Performance issues
  • Excessive eager loading
  • Circular references

What is N+1 Query Problem?

N+1 problem occurs when:

  • One query fetches child entities
  • Additional queries fetch parent entities repeatedly

This reduces performance significantly.


Best Practices for @ManyToOne

  • Prefer LAZY fetching when possible
  • Use proper indexing
  • Use JOIN FETCH queries for optimization
  • Avoid unnecessary bidirectional relationships
  • Use DTOs for API responses

Real-Time Example in E-Commerce Application

E-commerce application may contain:

  • Many orders β†’ One customer
  • Many products β†’ One category
  • Many transactions β†’ One account

These relationships are implemented using:

@ManyToOne

Difference Between @ManyToOne and @OneToMany

Feature @ManyToOne @OneToMany
Relationship Many children β†’ One parent One parent β†’ Many children
Example Order β†’ Customer Customer β†’ Orders
Collection Used No List/Set

Common Interview Questions on @ManyToOne

What is @ManyToOne mapping?

It defines a many-to-one relationship between entities.

What is @JoinColumn?

It specifies the foreign key column used in the relationship.

What is the default fetch type for @ManyToOne?

EAGER.

What is the difference between @ManyToOne and @OneToMany?

@ManyToOne maps many child entities to one parent entity, while @OneToMany maps one parent to many child entities.

How can performance issues be reduced?

By using LAZY loading and optimized queries.


Conclusion

@ManyToOne is one of the most commonly used relationship annotations in JPA and Hibernate.

It helps developers:

  • Map child-to-parent relationships
  • Reduce manual SQL joins
  • Simplify object navigation
  • Build scalable enterprise applications

Understanding @ManyToOne is essential for Spring Boot developers because enterprise applications heavily rely on relational mappings for database design and efficient data management.

Why this Spring Boot question is important?

This interview question helps candidates understand real-time backend development concepts, practical problem solving, coding fundamentals, system design basics and production-ready application behavior.

Practice this question carefully for Java backend roles, Spring Boot developer interviews, microservices interviews, company interviews and full-stack developer preparation.

About the Author

Naresh Kumar is a Senior Java Backend Engineer with experience building enterprise applications using Java, Spring Boot, Microservices, Docker, Kubernetes and Cloud technologies.