Hibernate many-to-many mapping using Annotations

In this article, we will create many-to-many mapping between “person” and “address” tables.

This is how the project structure will look like after we finish creating all classes :

hibernate many to many example

To start with, lets first create the tables.
 

Creating tables

hibernate many-to-many mapping

We have set the “hibernate.hbm2ddl.auto” parameter to “create” which should create the tables when the program is run. But you can also create the tables manually with these scripts.

    create table address (
        id bigint not null auto_increment,
        city varchar(255),
        number varchar(255),
        street varchar(255),
        primary key (id)
    )
    create table person (
        id bigint not null auto_increment,
        name varchar(255),
        primary key (id)
    )
    create table person_address (
        persons_id bigint not null,
        addresses_id bigint not null
    )
    alter table person_address 
        add constraint FK_b8cr46tcvhshg7x2tttp8fjla 
        foreign key (addresses_id) 
        references address (id)
    alter table person_address 
        add constraint FK_sktd54g3e418dc7hoaahwp5xq 
        foreign key (persons_id) 
        references person (id)

Here is how the hibernate.cfg.xml looks like with hbm2ddl set to “create”:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory name="">
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.password">passwrd</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/TestDB</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">create</property>

    <mapping class="com.topjavatutorial.manytomany.Address" />
    <mapping class="com.topjavatutorial.manytomany.Person" />
  </session-factory>
</hibernate-configuration>

 

Entity classes

Let’s create the Person and Address entity classes.

Person.java

package com.topjavatutorial.manytomany;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name = "person")
public class Person {
  @Id
  @GeneratedValue
  @Column(name = "id")
  private Long id;

  private String name;

  @ManyToMany(cascade = { CascadeType.ALL })
  private List<Address> addresses = new ArrayList<>();

  public Long getId() {
    return id;
  }

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

  public List<Address> getAddresses() {
    return addresses;
  }

  public void setAddresses(List<Address> addresses) {
    this.addresses = addresses;
  }

  public String getName() {
    return name;
  }

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

  @Override
  public String toString() {
    return "Person" + "\n Id: " + this.id + "\n Name: " + this.name;
  }
}

 
Address.java
package com.topjavatutorial.manytomany;

import java.util.List;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name = "address")
public class Address {
  @Id
  @GeneratedValue
  @Column(name = "id")
  private Long id;
  private String number;
  private String street;
  private String city;
  @ManyToMany(mappedBy = "addresses")
  private List<Person> persons;

  public Long getId() {
    return id;
  }

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

  public String getNumber() {
    return number;
  }

  public void setNumber(String number) {
    this.number = number;
  }

  public String getStreet() {
    return street;
  }

  public void setStreet(String street) {
    this.street = street;
  }

  public String getCity() {
    return city;
  }

  public void setCity(String city) {
    this.city = city;
  }

  public List<Person> getPersons() {
    return persons;
  }

  public void setPersons(List<Person> persons) {
    this.persons = persons;
  }

  @Override
  public String toString() {
    return "Address" + "\n Number: " + this.number + "\n Street: "
        + this.street + "\n City: " + this.city;
  }

}

 

Insert data to person, address tables

Lets first add the following class to obtain a SessionFactory.

HibernateUtil.java

package com.topjavatutorial.manytomany;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

  private static final SessionFactory sessionFactory;
  static {

    Configuration configuration = new Configuration().configure();
    StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
        .applySettings(configuration.getProperties());
    sessionFactory = configuration.buildSessionFactory(builder.build());
  }

  public static SessionFactory getSessionFactory() {
    return sessionFactory;
  }

}


 
Now, the following code actually inserts the records.

DemoManyToManyMapping.java

package com.topjavatutorial.manytomany;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;

public class DemoManyToManyMapping {

  public static void main(String[] args) {

    Person person1 = new Person();
    person1.setName("John");
    
    Person person2 = new Person();
    person2.setName("Dave");

    Address address1 = new Address();
    address1.setCity("Las Vegas");
    address1.setNumber("123");
    address1.setStreet("ABC Street");
    
    Address address2 = new Address();
    address2.setCity("Jacksonville");
    address2.setNumber("456");
    address2.setStreet("XYZ Street");
    
    List<Address> addresses = new ArrayList<>();
    addresses.add(address1);
    addresses.add(address2);

    person1.setAddresses(addresses);
    person2.setAddresses(addresses);

    SessionFactory factory = HibernateUtil.getSessionFactory();
    Session session = factory.openSession();
    session.getTransaction().begin();
    session.save(person1);
    session.save(person2);
    session.getTransaction().commit();
  }

}

Output :

Hibernate:
insert
into
person
(name)
values
(?)

Hibernate:
insert
into
address
(city, number, street)
values
(?, ?, ?)

Hibernate:
insert
into
address
(city, number, street)
values
(?, ?, ?)

Hibernate:
insert
into
person
(name)
values
(?)

Hibernate:
insert
into
person_address
(persons_id, addresses_id)
values
(?, ?)

Hibernate:
insert
into
person_address
(persons_id, addresses_id)
values
(?, ?)

Hibernate:
insert
into
person_address
(persons_id, addresses_id)
values
(?, ?)

Hibernate:
insert
into
person_address
(persons_id, addresses_id)
values
(?, ?)
 
Person table

Address table

Person_Address table

 

Retrieve data

DemoManyToManyMapping.java

  Criteria criteria = session.createCriteria(Person.class);
  criteria.add(Restrictions.eq("name", "John"));

  Person person = (Person) criteria.uniqueResult();
  System.out.println(person.getName());
  System.out.println(person.getAddresses());

Output:

Hibernate:
select
this_.id as id1_1_0_,
this_.name as name2_1_0_
from
person this_
where
this_.name=?
 
John
[Address
Number: 123
Street: ABC Street
City: Las Vegas,
Address
Number: 456
Street: XYZ Street
City: Jacksonville]

 

© 2016, https:. All rights reserved. On republishing this post, you must provide link to original post

Leave a Reply.. code can be added in <code> </code> tags