This is 4 of 8 parts of tutorial series
Tutorial Content:
- Introduction to hibernate framework
- Hibernate hello world example in eclipse
- Difference between openSession and getCurrentSession
- Hibernate one to one mapping example
- Hibernate one to many mapping example
- Hibernate many to many mapping example
- Hibernate inheritance:Table per class hierarchy
- Hibernate inheritance:table per subclass
- Hibernate inheritance:Table per concrete class
- Difference between openSession and getCurrentSession
- Difference between get and load
- Spring MVC Hibernate MySQL CRUD example
- Spring Rest hibernate example
In this example we will see how to implement one to many relationship using annotations.
Lets take example of Country and state.One Country can have n number of states.Following is relationship diagram among them.
Now to create above tables in database, you need to create two java files i.e. Country.java and State.java.
- Looking for ⚒️ tech jobs? Go to our job portal.
- Looking for tech events? Go to tech events 🗓️ Calendar.️
1.Country.java
Country class will be used to create COUNTRY table in database.
Create Country.java in src->org.arpit.javapostsforlearning.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
package org.arpit.javapostsforlearning; import java.util.ArrayList; import java.util.Collection; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.OneToMany; import javax.persistence.Table; @Entity @Table(name="COUNTRY") public class Country { @Id @Column(name="Country_Name") String countryName ; @OneToMany(cascade=CascadeType.ALL) @JoinTable(name="COUNTRY_STATE",joinColumns={@JoinColumn(name="Country_Name")},inverseJoinColumns={@JoinColumn(name="State_Name")}) Collection listOfStates=new ArrayList(); @Column(name="Country_Population") long countryPopulation; public Country() { } public Country(String countryName, long countryPopulation) { this.countryName = countryName; this.countryPopulation = countryPopulation; } public long getCountryPopulation() { return countryPopulation; } public void setCountryPopulation(long countryPopulation) { this.countryPopulation = countryPopulation; } public String getCountryName() { return countryName; } public void setCountryName(String countryName) { this.countryName = countryName; } public Collection getListOfStates() { return listOfStates; } public void setListOfStates(Collection listOfStates) { this.listOfStates = listOfStates; } } |
The @OneToMany annotation is used to create the one-to-many relationship between the Country and State entities. The @JoinTable annotation is used to create the COUNTRY_STATE link table and @JoinColumn annotation is used to refer the linking columns in both the tables.
2.State.java
State class will be used to create STATE table in database.
Create State.java in src->org.arpit.javapostsforlearning.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
package org.arpit.javapostsforlearning;import javax.persistence.Column; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="STATE") public class State { @Id @Column(name="State_Name") private String stateName; @Column(name="State_Population") long statePopulation; public State() { } public State(String stateName, long statePopulation) { super(); this.stateName = stateName; this.statePopulation = statePopulation; } public String getStateName() { return stateName; } public void setStateName(String stateName) { this.stateName = stateName; } public long getStatePopulation() { return statePopulation; } public void setStatePopulation(long statePopulation) { this.statePopulation = statePopulation; } } |
3.Hiberante.cfg.xml:
Create a file named “hibernate.cfg.xml” in src folder.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<?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> <!-- Database connection settings --> <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> <property name="connection.url">jdbc:sqlserver://localhost:1433;database=UserInfo</property> <property name="connection.username">sa</property> <property name="connection.password"></property> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.SQLServer2005Dialect</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">create</property> <mapping class="org.arpit.javapostsforlearning.Country"></mapping> <mapping class="org.arpit.javapostsforlearning.State"></mapping> </session-factory> </hibernate-configuration> |
4.Main Class:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package org.arpit.javapostsforlearning; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class HibernateMain { public static void main(String[] args) { Country countryIndia=new Country("India",50000000); State mpState=new State("Madhya Pradesh",1000000); State maharastraState=new State("Maharastra",2000000); countryIndia.getListOfStates().add(mpState); countryIndia.getListOfStates().add(maharastraState); Configuration configuration=new Configuration(); configuration.configure(); ServiceRegistry sr= new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); SessionFactory sf=configuration.buildSessionFactory(sr); Session ss=sf.openSession(); ss.beginTransaction(); ss.save(countryIndia); ss.getTransaction().commit(); ss.close(); } } |
Project Struture:
5.Run it:
When you run it,you will get following output.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Hibernate: create table COUNTRY (Country_Name varchar(255) not null, Country_Population bigint, primary key (Country_Name)) Hibernate: create table COUNTRY_STATE (Country_Name varchar(255) not null, State_Name varchar(255) not null, unique (State_Name)) Hibernate: create table STATE (State_Name varchar(255) not null, State_Population bigint, primary key (State_Name)) Hibernate: alter table COUNTRY_STATE add constraint FKA1E1226881D857C0 foreign key (State_Name) references STATE Hibernate: alter table COUNTRY_STATE add constraint FKA1E1226865CEDD60 foreign key (Country_Name) references COUNTRY Feb 02, 2013 10:26:07 PM org.hibernate.tool.hbm2ddl.SchemaExport execute INFO: HHH000230: Schema export complete Hibernate: select state_.State_Name, state_.State_Population as State2_1_ from STATE state_ where state_.State_Name=? Hibernate: select state_.State_Name, state_.State_Population as State2_1_ from STATE state_ where state_.State_Name=? Hibernate: insert into COUNTRY (Country_Population, Country_Name) values (?, ?) Hibernate: insert into STATE (State_Population, State_Name) values (?, ?) Hibernate: insert into STATE (State_Population, State_Name) values (?, ?) Hibernate: insert into COUNTRY_STATE (Country_Name, State_Name) values (?, ?) Hibernate: insert into COUNTRY_STATE (Country_Name, State_Name) values (?, ?) |
6.SQL output:
COUNTRY table in database
STATE table in database
COUNTRY_STATE table is created to link above two tables.
Source code:
1 2 3 4 |
<b>Source:</b><a href="https://dl.dropbox.com/s/m1udlhoxee8d3s7/OneToManyMappingExample.zip" target="_blank">Download without jars files</a> <b>Source + lib</b>: <a href="https://dl.dropbox.com/s/657mja4n3ue7qy9/OneToManyMappingExampleWithJars.zip" target="_blank">Download with jar files</a> |