How does one-to-many relationships works in hibernate?
Hibernate Mapping One-to-Many
Hibernate provides facility of mapping. You can do mapping through hbm.xml or through annotation. Here is an example showing one to many relationship using annotation?
We have two table ?
One author can write more than one book..So here is mapping one author to many books.
Author.java
package net.roseindia.table;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name = "author")
public class Author {
private int id;
private String name;
private Set<Book> bookSet = new HashSet<Book>();
public Author() {
}
public Author(String name, Set<Book> book) {
this.name = name;
this.bookSet = book;
}
@Id
@GeneratedValue
@Column(name = "id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(cascade = CascadeType.ALL)
public Set<Book> getBookSet() {
return bookSet;
}
public void setBookSet(Set<Book> bookSet) {
this.bookSet = bookSet;
}
}
Book.java
package net.roseindia.table;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "book")
public class Book {
private int id;
private String tile;
public Book() {
}
public Book(String title) {
this.tile = title;
}
@Id
@GeneratedValue
@Column(name = "id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "title")
public String getTile() {
return tile;
}
public void setTile(String tile) {
this.tile = tile;
}
}
Continue....
2.
hibernate-cfg.xml is configuration file saved in the same folder where the source code of class file is saved. It creates the connection pool and set-up required environment.
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernateRelationShip</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">create-drop</property>
<!-- Mapping files -->
<mapping class="net.roseindia.table.Book" />
<mapping class="net.roseindia.table.Author" />
</session-factory>
</hibernate-configuration>
3.
Now create an util class as HibernateUtil.java.
package net.roseindia.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
public class HibernateUtil {
private static SessionFactory sessionFactory = null;
static {
sessionFactory = new AnnotationConfiguration().configure()
.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
4.
Here is your main class-
package net.roseindia.application;
import java.util.HashSet;
import java.util.Set;
import net.roseindia.table.Author;
import net.roseindia.table.Book;
import net.roseindia.util.HibernateUtil;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class OneToManyRelation {
public static void main(String[] args) {
Session session = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
Set<Book> books = new HashSet<Book>();
books.add(new Book("Java"));
books.add(new Book("C++"));
Author author = new Author("Ratna", books);
Transaction tr = session.beginTransaction();
session.save(author);
tr.commit();
System.out.println("Done");
} catch (HibernateException he) {
System.out.println(he.getMessage());
} finally {
session.close();
}
}
}