In this post , we will learn to implement inheritance by using hibernate JOINED strategy .
In this example we have a Person class which will have two fields (firstName and lastName)
Person Class is Extended by Student and Teacher classes , which will share the fields of Person apart from having their own fields.
Here is the code for Base class Person . Please note that we have used @Inheritance annotation in this base class along with strategy defined as JOINED.
package com.javaroots.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; /** * * * @author Abhishek Somani * */ @Entity @Table(name="person") @Inheritance(strategy=InheritanceType.JOINED) public class Person { @Id @GeneratedValue @Column(name="person_id") private Long id; @Column(name="firstName") private String firstName; @Column(name="lastName") private String lastName; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }This is the Student class which extends Person class. We are using @PrimaryKeyJoinColumn annotation which will create a primary key named student_id for student table which will reference to person table primary key(person_id).
package com.javaroots.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; /** * * * @author Abhishek Somani * */ @Entity @Table(name = "student") @PrimaryKeyJoinColumn(name = "student_id", referencedColumnName = "person_id") public class Student extends Person { @Column(name = "standard") private String standard; @Column(name = "instructor") private String instructor; public String getStandard() { return standard; } public void setStandard(String standard) { this.standard = standard; } public String getInstructor() { return instructor; } public void setInstructor(String instructor) { this.instructor = instructor; } }Similar to Student , we have another class called Teacher which will also get it's primary key(teacher_id) from person table .
package com.javaroots.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; /** * * * @author Abhishek Somani * */ @Entity @Table(name = "teacher") @PrimaryKeyJoinColumn(name = "teacher_id", referencedColumnName = "person_id") public class Teacher extends Person{ @Column(name = "main_subject") private String mainSubject; @Column(name = "salary") private int salary; @Column(name = "type") private String type; // Primary or Secondary School teacher public String getMainSubject() { return mainSubject; } public void setMainSubject(String mainSubject) { this.mainSubject = mainSubject; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } public String getType() { return type; } public void setType(String type) { this.type = type; } }This is the test class to create entries in Student , Teacher and Person Table.
package com.javaroots.main; import org.hibernate.Session; import com.javaroots.model.Student; import com.javaroots.model.Teacher; import com.javaroots.util.HibernateUtil; public class HibernateTest { public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Student st = new Student(); st.setInstructor("Joshua"); st.setFirstName("James"); st.setLastName("java roots"); session.save(st); Teacher te = new Teacher(); te.setMainSubject("java"); te.setSalary(1000); te.setFirstName("Gosling"); te.setLastName("opensource"); session.save(te); session.getTransaction().commit(); } }These are the structures of tables(person , teacher , student) . teacher and student table's primary key references to person table primary key .
CREATE TABLE `person` ( `person_id` bigint(20) NOT NULL AUTO_INCREMENT, `firstName` varchar(255) DEFAULT NULL, `lastName` varchar(255) DEFAULT NULL, PRIMARY KEY (`person_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8$$ delimiter $$ CREATE TABLE `student` ( `instructor` varchar(255) DEFAULT NULL, `standard` varchar(255) DEFAULT NULL, `student_id` bigint(20) NOT NULL, PRIMARY KEY (`student_id`), KEY `FK8FFE823B961B9B25` (`student_id`), CONSTRAINT `FK8FFE823B961B9B25` FOREIGN KEY (`student_id`) REFERENCES `person` (`person_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ delimiter $$ CREATE TABLE `teacher` ( `main_subject` varchar(255) DEFAULT NULL, `salary` int(11) DEFAULT NULL, `type` varchar(255) DEFAULT NULL, `teacher_id` bigint(20) NOT NULL, PRIMARY KEY (`teacher_id`), KEY `FKAA31CBE28C839C1E` (`teacher_id`), CONSTRAINT `FKAA31CBE28C839C1E` FOREIGN KEY (`teacher_id`) REFERENCES `person` (`person_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8$$These are the queries fired by hibernate . Whenever a teacher or student object is created , hibernate first create an entry in person table , and then creates entry in student or teacher table with the primary id of person .
Hibernate: alter table student drop foreign key FK8FFE823B961B9B25 Hibernate: alter table teacher drop foreign key FKAA31CBE28C839C1E Hibernate: drop table if exists person Hibernate: drop table if exists student Hibernate: drop table if exists teacher Hibernate: create table person ( person_id bigint not null auto_increment, firstName varchar(255), lastName varchar(255), primary key (person_id) ) Hibernate: create table student ( instructor varchar(255), standard varchar(255), student_id bigint not null, primary key (student_id) ) Hibernate: create table teacher ( main_subject varchar(255), salary integer, type varchar(255), teacher_id bigint not null, primary key (teacher_id) ) Hibernate: alter table student add index FK8FFE823B961B9B25 (student_id), add constraint FK8FFE823B961B9B25 foreign key (student_id) references person (person_id) Hibernate: alter table teacher add index FKAA31CBE28C839C1E (teacher_id), add constraint FKAA31CBE28C839C1E foreign key (teacher_id) references person (person_id) Hibernate: insert into person (firstName, lastName) values (?, ?) Hibernate: insert into student (instructor, standard, student_id) values (?, ?, ?) Hibernate: insert into person (firstName, lastName) values (?, ?) Hibernate: insert into teacher (main_subject, salary, type, teacher_id) values (?, ?, ?, ?)This is how the inheritance is implemented in hibenrate JOINED inheritance strategy. Post Comments and Suggestions !!