Joined Inheritance Strategy in Hibernate

Hibernate uses some strategies for saving an inheritance hierarchy of classes created in Java to the databases like SINGLE_TABLE, TABLE_PER_CLASS and JOINED.  We use @Inheritance annotation over the entity class to specify the inheritance strategy. We specify the inheritance strategy by assigning a strategy from the InheritanceType enumeration to the strategy parameter of the @Inheritance annotation.  Strategies defined in the InheritanceType enumeration are InheritanceType.SINGLE_TABLE, InheritanceType.TABLE_PER_CLASS and InheritanceType.JOINED. If you don’t provide the @Inheritance annotation or any strategies, the default strategy is SINGLE_TABLE.

In the JOINED strategy, hibernate will create a separate table for all the classes in an inheritance hierarchy, but the tables are normalized. Columns that you receive as part of inheritance will be part of parent class and referred from subclass tables using a foreign key. In a TABLE_PER_CLASS strategy, all these columns were present in all the tables and there were no foreign key references. This is the most normalized inheritance strategy. For instance, Shape contains id and fillcolor. Rectangle or Circle will not have fillcolor, but will have a shapeid column that references the shapeid column of the Shape table. We will understand this better with an example.

In this example, we will create and save three entity classes – Shape, Rectangle and Circle; where Rectangle and Circle extends from Shape. If you are not following the tutorials in order, refer to the article http://javajee.com/your-first-hibernate-program for the basic setup including hibernate configuration file. You should replace the user class in the configuration file with Shape, Rectangle and Circle classes as:

<!-- Names the annotated entity class -->

<mapping class="com.javajee.hiberex.dto.Shape"/>

<mapping class="com.javajee.hiberex.dto.Rectangle"/>

<mapping class="com.javajee.hiberex.dto.Circle"/>

Else you will get org.hibernate.MappingException: Unknown entity:…

 

The base entity class, shape will have id and fillcolor properties:

@Entity

@Inheritance (strategy = InheritanceType.JOINED)

public class Shape {

  @Id @GeneratedValue

  int shapeId;

  String fillcolor;

 //Getters and setters not shown here; create them manually or generate in eclipse.

}

 

Entity class Rectangle extends from Shape, and have length and breadth properties:

@Entity

public class Rectangle extends Shape{

  long length;

  long breadth;

//Getters and setters not shown here; create them manually or generate in eclipse.

}

This class is same as in TABLE_PER_CLASS strategy or SINGLE_TABLE strategy.

 

Entity class Circle extends from Shape, and has one property radius:

@Entity

public class Circle extends Shape{

  long radius;

//Getters and setters not shown here; create them manually or generate in eclipse.

}

This class is same as in TABLE_PER_CLASS strategy or SINGLE_TABLE strategy.

 

Now use the below test class to create objects for these classes, populate data and save them:

public class ShapeTest {

 

  public static void main(String[] args) {

    Shape s = new Shape();

    s.setFillcolor("Green");

    Rectangle r = new Rectangle();

    r.setBreadth(4);

    r.setLength(6);

    Circle c = new Circle();

    c.setRadius(5);

 

    Configuration configuration = new Configuration();

    configuration.configure();

    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()

        .applySettings(configuration.getProperties()).buildServiceRegistry();

    SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

    Session session = sessionFactory.openSession();

    session.beginTransaction();

    session.save(s);

    session.save(r);

    session.save(c);

    session.getTransaction().commit();

  }

This class is same as in TABLE_PER_CLASS strategy or SINGLE_TABLE strategy.

 

When you execute the above test class, below queries are executed by hibernate (as seen from the console):

Hibernate: insert into Shape (fillcolor) values (?)

Hibernate: insert into Shape (fillcolor) values (?)

Hibernate: insert into Rectangle (breadth, length, shapeId) values (?, ?, ?)

Hibernate: insert into Shape (fillcolor) values (?)

Hibernate: insert into Circle (radius, shapeId) values (?, ?)

 

You can see that hibernate has created one table each for Shape, Rectangle and Circle.  Shape contains id and fillcolor. Rectangle or Circle does not have fillcolor, but has a shapeid column that references the shapeid column of the Shape table. Things will be more clear, once you see the database snapshot. Just do a select all query (select * from Shape/Rectangle/Circle). This is the most normalized inheritance type. Please note that the level of normalization needed might be different from a case to case basis depending on the complexity of your application. Otherwise there would not have been three different strategies, but only one. Please check with your database expert or see the notes on database under the extras section here for finding the right one for you.

 

Tags: 

Quick Notes Finder Tags

Activities (1) advanced java (1) agile (3) App Servers (6) archived notes (2) Arrays (1) Best Practices (12) Best Practices (Design) (3) Best Practices (Java) (7) Best Practices (Java EE) (1) BigData (3) Chars & Encodings (6) coding problems (2) Collections (15) contests (3) Core Java (All) (55) course plan (2) Database (12) Design patterns (8) dev tools (3) downloads (2) eclipse (9) Essentials (1) examples (14) Exception (1) Exceptions (4) Exercise (1) exercises (6) Getting Started (18) Groovy (2) hadoop (4) hibernate (77) hibernate interview questions (6) History (1) Hot book (5) http monitoring (2) Inheritance (4) intellij (1) java 8 notes (4) Java 9 (1) Java Concepts (7) Java Core (9) java ee exercises (1) java ee interview questions (2) Java Elements (16) Java Environment (1) Java Features (4) java interview points (4) java interview questions (4) javajee initiatives (1) javajee thoughts (3) Java Performance (6) Java Programmer 1 (11) Java Programmer 2 (7) Javascript Frameworks (1) Java SE Professional (1) JPA 1 - Module (6) JPA 1 - Modules (1) JSP (1) Legacy Java (1) linked list (3) maven (1) Multithreading (16) NFR (1) No SQL (1) Object Oriented (9) OCPJP (4) OCPWCD (1) OOAD (3) Operators (4) Overloading (2) Overriding (2) Overviews (1) policies (1) programming (1) Quartz Scheduler (1) Quizzes (17) RabbitMQ (1) references (2) restful web service (3) Searching (1) security (10) Servlets (8) Servlets and JSP (31) Site Usage Guidelines (1) Sorting (1) source code management (1) spring (4) spring boot (3) Spring Examples (1) Spring Features (1) spring jpa (1) Stack (1) Streams & IO (3) Strings (11) SW Developer Tools (2) testing (1) troubleshooting (1) user interface (1) vxml (8) web services (1) Web Technologies (1) Web Technology Books (1) youtube (1)