Open In App

Hibernate – One-to-Many Mapping

Improve
Improve
Like Article
Like
Save
Share
Report

Hibernate is used to increase the data manipulation efficiency between the spring application and the database, insertion will be done is already defined with the help of hibernating.

  • JPA (Java persistence API) is like an interface and hibernate is the implementation of the methods of the interface.

In this article, we will discuss One-to-Many Mapping in the Hibernate. Let’s understand the One-to-many mapping with the help of a real-life example. Bike manufacturers can manufacture multiple models of the bike, but the same bike model cannot be manufactured by multiple manufacturers.

Syntax:

This mapped variable of the other tables is responsible for mapping between two tables.

@oneToMany(mappedby=”nameofmappedvariable”)

For this example, we will map the id field of manufactures to the manufacture_id of the model entity.

Link between the table

1. Configuration of Hibernate One-to-Many Mapping

1.1 Go to this spring initializr and fill in the details mentioned.

  • Project: Maven
  • Language: Java
  • Spring Boot: 2.5.7
  • Packaging: JAR
  • Java: 11
  • Dependencies:
    • Spring Web
    • Spring Data JPA
    • MySql Driver
Project Bootstrap

Click on Generate which will download the starter project.

1.2 Extract the zip file

Now open a suitable IDE and then go to File > New > Project from existing sources > Spring-boot-app and select pom.xml. Click on import changes on prompt and wait for the project to sync as pictorially depicted below as follows:

Options to open project

1.3: Adding the necessary properties in the application.properties file

Database configuration required for connection of Mysql database to the Spring Boot Application.

spring.datasource.username=root
spring.datasource.password=Aayush
spring.datasource.url=jdbc:mysql://localhost:3306/mapping
spring.jpa.hibernate.ddl-auto=update

1.4 Folder directory creation

Go to src > main > java > com > example > Mapping and create two files in the models folder i.e Manufactures.java and  Model.java

Directory view

2. Implementing the Application

Over here, we will implement the

  • Entity – Manufacures, Model
  • Repository – ManufacuresRepo, ModelRepo
  • Application class

2.1 Manufactures.java

This contains the entity Manufactures, which contains the required associated fields.

  • id – int type
  • manufactures_name – string type
  • models – mapped with one-to-many mapping
  • constructors, getters, setters, etc.
Java
package com.example.Mapping.Models;

import javax.persistence.*;
import java.util.List;

@Entity
public class Manufactures {

    // Unique identifier for the manufacturer
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    // Name of the manufacturer
    private String manufactures_name;

    // A manufacturer can have many models
    @OneToMany(mappedBy = "manufacturer")
    private List<Model> models;

    // Constructor with both id and name
    public Manufactures(int id, String manufactures_name) {
        this.id = id;
        this.manufactures_name = manufactures_name;
    }

    // Default constructor
    public Manufactures() {

    }

    // Getters and setters for id and name

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getManufactures_name() {
        return manufactures_name;
    }

    public void setManufactures_name(String manufactures_name) {
        this.manufactures_name = manufactures_name;
    }

    // Getter for models
    public List<Model> getModels() {
        return models;
    }

    // Setter for models
    public void setModels(List<Model> models) {
        this.models = models;
    }
}

2.2 Models (Mapped by table)

This contains the entity Model with various fields and methods-

  • id – int type
  • name – String type
  • ob – object mapped with manufacture_id as Many-to-one
  • Constructors, getters, setter, etc.
Java
package com.example.Mapping.Models;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Model {

    // Unique identifier for the model
    @Id
    private int model_id;

    // Name of the model
    private String name;

    // A model belongs to one manufacturer
      // Foreign key referencing the manufacturer table
    @ManyToOne
    @JoinColumn(name = "manufacture_id")
    private Manufactures manufacturer;

    // Constructor with all fields
    public Model(int model_id, String name, Manufactures manufacturer) {
        this.model_id = model_id;
        this.name = name;
        this.manufacturer = manufacturer;
    }

    // Default constructor
    public Model() {

    }

    // Getters and setters

    public int getModel_id() {
        return model_id;
    }

    public void setModel_id(int model_id) {
        this.model_id = model_id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Manufactures getManufacturer() {
        return manufacturer;
    }

    public void setManufacturer(Manufactures manufacturer) {
        this.manufacturer = manufacturer;
    }
}

3. Adding the JPA repository

3.1 ManufactureRepo

This Interface contains the forms the bridge of entity Manufactures to the Database

Java
package com.example.Mapping.Repositories;

import com.example.Mapping.Models.Manufactures;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * Spring Data JPA repository for the Manufacture entity.
 * This interface extends JpaRepository and provides basic 
 * CRUD operations for Manufactures entities.
 */
public interface ManufacturesRepo extends JpaRepository<Manufactures, Integer> {
}

3.2 ModelRepo

This Interface contains the forms the bridge of entity Model to the Database

Java
package com.example.Mapping.Repositories;

import com.example.Mapping.Models.Model;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * Spring Data JPA repository for the Model entity.
 * This interface extends JpaRepository and provides basic 
 * CRUD operations for Model entities.
 */
public interface ModelRepo extends JpaRepository<Model, Integer> {
}

3.3 MappingApplication

Driver class for Spring Boot application to test the One-to-One Mapping of hibernate.

  • This Spring Boot application initializes and saves data using JPA repositories.
  • It creates a Manufacturer(“Honda”) entity and two associated Model (“AYZ” and “ZET”) entities with a one-to-many relationship.
  • The data is then stored in corresponding repositories during the application’s run.
Java
package com.example.Mapping;

import com.example.Mapping.Models.Manufactures;
import com.example.Mapping.Models.Model;
import com.example.Mapping.Repositories.ManufacturesRepo;
import com.example.Mapping.Repositories.ModelRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Spring Boot application for mapping relationships between Manufactures and Models.
 */
@SpringBootApplication
public class MappingApplication implements CommandLineRunner {

    // Injecting Manufactures and Model repositories using autowiring
    @Autowired
    private ManufacturesRepo manufacturesRepo;
    @Autowired
    private ModelRepo modelRepo;

    public static void main(String[] args) {
        SpringApplication.run(MappingApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

        // Creating a new Manufactures object with ID 1 and name "Honda"
        Manufactures data = new Manufactures(1, "Honda");

        // Saving the Manufactures record
        manufacturesRepo.save(data);

        // Creating two new Model objects associated with the "Honda" manufacturer
        Model model1 = new Model(1, "AYZ", data);
        Model model2 = new Model(2, "ZET", data);

        // Saving the Model records
        modelRepo.save(model1);
        modelRepo.save(model2);
    }
}

Run the main application:

Console log of project running.

Console logs

Manufacture Table

Database view of manufactures table:

Tabular view of database

Model Table

Database view of model table:

Tablur view of model table

The below image depicts the link between the two tables.


Link of articles




Last Updated : 12 Mar, 2024
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads