Joined Inheritance

Hibernate provides with another strategy of inheritance which is "Joined". This strategy is similar to table per class because even in this strategy hibernate creates separate tables for the entities. Internally hibernate uses the Join table concepts of the database.
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>
        <property name="connection.username">hr</property>
        <property name="connection.password">hr</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.OracleDialect</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>

        <!-- Names the annotated entity class -->
        <mapping class="com.ram.dao.Vehicle"/>
        <mapping class="com.ram.dao.TwoWheeler"/>
        <mapping class="com.ram.dao.FourWheeler"/>

    </session-factory>

</hibernate-configuration>
File: com.ram.dao.Vehicle.java
package com.ram.dao;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Vehicle {
 @Id @GeneratedValue
 private int vehicleId;
 private String vehicleName;
 
 public int getVehicleId() {
  return vehicleId;
 }
 public void setVehicleId(int vehicleId) {
  this.vehicleId = vehicleId;
 }
 public String getVehicleName() {
  return vehicleName;
 }
 public void setVehicleName(String vehicleName) {
  this.vehicleName = vehicleName;
 }
}

File: com.ram.dao.TwoWheeler.java
package com.ram.dao;

import javax.persistence.Entity;

@Entity
public class TwoWheeler extends Vehicle {
 private String steeringHandle;

 public String getSteeringHandle() {
  return steeringHandle;
 }

 public void setSteeringHandle(String steeringHandle) {
  this.steeringHandle = steeringHandle;
 }
}

File: com.ram.dao.FourWheeler.java
package com.ram.dao;

import javax.persistence.Entity;

@Entity
public class FourWheeler extends Vehicle {
 private String steeringWheel;

 public String getSteeringWheel() {
  return steeringWheel;
 }

 public void setSteeringWheel(String steeringWheel) {
  this.steeringWheel = steeringWheel;
 }
}

File: com.ram.hibernate.JoinedInheritanceExample.java
package com.ram.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.ram.dao.FourWheeler;
import com.ram.dao.TwoWheeler;
import com.ram.dao.Vehicle;

public class JoinedInheritanceExample {
 public static void main(String[] args) {
  Vehicle vehicle = new Vehicle();
  vehicle.setVehicleName("Car");
  
  TwoWheeler yamaha = new TwoWheeler();
  yamaha.setVehicleName("Yamaha");
  yamaha.setSteeringHandle("Yamaha steering handle");
  
  FourWheeler benz = new FourWheeler();
  benz.setVehicleName("Benz");
  benz.setSteeringWheel("Benz steering wheel");
  
  SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
  Session session = sessionFactory.openSession();
  
  session.beginTransaction();
  session.save(vehicle);
  session.save(yamaha);
  session.save(benz);
  
  session.getTransaction().commit();
  session.close();
 }
}

Execute the JoinedInheritanceExample.java and you get the below output.

No comments:

Post a Comment