@ElementCollection in Hibernate
January 27, 2013
In Hibernate Annotation, @ElementCollection is the feature which gets the columns values from another table without mapping two tables.
In my example, I have taken two entity student and college. In college entity, we will fetch students without mapping student and college entity. @CollectionTable will join the two tables for the given primary and foreign key.
Student.java
package com.concretepage.persistence; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="student") public class Student implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name="student_id") private int studentId; @Column(name="student_name") private String studentName; @Column(name="college_id") private int collegeId; public Student(int studentId,String studentName,int collegeId){ this.studentId=studentId; this.studentName=studentName; this.collegeId=collegeId; } public int getStudentId() { return studentId; } public void setStudentId(int studentId) { this.studentId = studentId; } public String getStudentName() { return studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } public int getCollegeId() { return collegeId; } public void setCollegeId(int collegeId) { this.collegeId = collegeId; } }
package com.concretepage.persistence; import java.io.Serializable; import java.util.Set; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.Table; @Entity @Table(name="college") public class College implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name="college_id") private int collegeId; @Column(name="name") private String collegeName; @ElementCollection @CollectionTable(name="student", joinColumns=@JoinColumn(name="college_id")) @Column(name="student_name") private Set<String> students; public College(int collegeId,String collegeName){ this.collegeId=collegeId; this.collegeName=collegeName; } public Set<String> getStudents() { return students; } public void setStudents(Set<String> students) { this.students = students; } public int getCollegeId() { return collegeId; } public void setCollegeId(int collegeId) { this.collegeId = collegeId; } public String getCollegeName() { return collegeName; } public void setCollegeName(String collegeName) { this.collegeName = collegeName; } }
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.url"> jdbc:mysql://localhost:3306/hibernate</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password"></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">update</property> <mapping class="com.concretepage.persistence.Student"/> <mapping class="com.concretepage.persistence.College"/> </session-factory> </hibernate-configuration>
package com.concretepage.util; import java.util.Set; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import com.concretepage.persistence.College; import com.concretepage.persistence.Student; public class HibernateUtil { private static final SessionFactory concreteSessionFactory; static { try { concreteSessionFactory = new AnnotationConfiguration() .configure().buildSessionFactory(); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static Session getSession() throws HibernateException { return concreteSessionFactory.openSession(); } public static void main(String... args){ Session session=getSession(); session.beginTransaction(); College c=new College(1,"S.S.P.C"); session.persist(c); Student s1=new Student(1,"Atul",1); session.persist(s1); Student s2=new Student(2,"Saurabh",1); session.persist(s2); session.getTransaction().commit(); session.refresh(c); College ob=(College)session.get(College.class, new Integer(1)); Set<String> names=ob.getStudents(); for(String s:names){ System.out.println(s); } } }
Hibernate: insert into college (name, college_id) values (?, ?) Hibernate: insert into student (college_id, student_name, student_id) values (?, ?, ?) Hibernate: insert into student (college_id, student_name, student_id) values (?, ?, ?) Hibernate: select college0_.college_id as college1_1_0_, college0_.name as name1_0_ from college college0_ where college0_.college_id=? Hibernate: select students0_.college_id as college2_1_0_, students0_.student_name as student3_0_ from student students0_ where students0_.college_id=? Saurabh Atul