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 :
To start with, lets first create the tables.
Creating tables
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
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