What are various Inheritance mapping strategies available in Hibernate?

There are three types of inheritance mapping strategies ?

  • Table per class hierarchy

  • Table per concrete class

  • Table per subclass

    In this article, we will discuss table per class hierarchy.

Table per class hierarchy

  • In this, only a single table is created for inheritance mapping. Disadvantages of this approach is that a lot of null values gets stored in the table.

  • @Inheritance(strategy=InheritanceType.SINGLE_TABLE), @DiscriminatorColumn and @DiscriminatorValue are the annotations used in this strategy.

  • @DiscriminatorColumn is used to create an additional column which is used to identify the hierarchy classes.

Consider the following example to understand this ?

Steps to implement ?

  • Create entity classes and use proper annotations for them.

  • Write the hibernate configuration file and add the mapping classes.

  • Write the code to create and store the data in the table.

1.CREATE ENTITY CLASSES

Car.java

<div class="code-mirror  language-java" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token keyword">package</span> <span class="token namespace">com<span class="token punctuation">.</span>tutorialspoint</span><span class="token punctuation">;</span>
<span class="token annotation punctuation">@Entity</span>
<span class="token annotation punctuation">@Table</span><span class="token punctuation">(</span>name <span class="token operator">=</span> <span class="token string">"car"</span><span class="token punctuation">)</span>
<span class="token annotation punctuation">@Inheritance</span><span class="token punctuation">(</span>strategy<span class="token operator">=</span><span class="token class-name">InheritanceType</span><span class="token punctuation">.</span>SINGLE_TABLE<span class="token punctuation">)</span>
<span class="token annotation punctuation">@DiscriminatorColumn</span><span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">"category"</span><span class="token punctuation">,</span>discriminatorType<span class="token operator">=</span><span class="token class-name">DiscriminatorType</span><span class="token punctuation">.</span>STRING<span class="token punctuation">)</span>
<span class="token annotation punctuation">@DiscriminatorValue</span><span class="token punctuation">(</span>value<span class="token operator">=</span><span class="token string">"car"</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Car</span> <span class="token punctuation">{</span>
   <span class="token annotation punctuation">@Id</span>
   <span class="token annotation punctuation">@GeneratedValue</span><span class="token punctuation">(</span>strategy<span class="token operator">=</span><span class="token class-name">GenerationType</span><span class="token punctuation">.</span>AUTO<span class="token punctuation">)</span>
   <span class="token keyword">private</span> <span class="token keyword">int</span> id<span class="token punctuation">;</span>

   <span class="token annotation punctuation">@Column</span><span class="token punctuation">(</span>name <span class="token operator">=</span> <span class="token string">"name"</span><span class="token punctuation">)</span>
   <span class="token keyword">private</span> <span class="token class-name">String</span> name<span class="token punctuation">;</span>
   <span class="token annotation punctuation">@Column</span><span class="token punctuation">(</span>name <span class="token operator">=</span> <span class="token string">"color"</span><span class="token punctuation">)</span>
   <span class="token keyword">private</span> <span class="token class-name">String</span> color<span class="token punctuation">;</span>
   <span class="token comment">//Getters</span>
   <span class="token comment">//Setters</span>
<span class="token punctuation">}</span>
</div>

Sports_Car.java

<div class="code-mirror  language-java" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token keyword">package</span> <span class="token namespace">com<span class="token punctuation">.</span>tutorialspoint</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">javax<span class="token punctuation">.</span>persistence<span class="token punctuation">.</span></span><span class="token operator">*</span><span class="token punctuation">;</span>
<span class="token annotation punctuation">@Entity</span>
<span class="token annotation punctuation">@DiscriminatorValue</span><span class="token punctuation">(</span><span class="token string">"sportscar"</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Sports_Car</span> <span class="token keyword">extends</span> <span class="token class-name">Car</span><span class="token punctuation">{</span>
   <span class="token annotation punctuation">@Column</span><span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">"mileage"</span><span class="token punctuation">)</span>
   <span class="token keyword">private</span> <span class="token keyword">int</span> mileage<span class="token punctuation">;</span>

   <span class="token annotation punctuation">@Column</span><span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">"cost"</span><span class="token punctuation">)</span>
   <span class="token keyword">private</span> <span class="token keyword">int</span> cost<span class="token punctuation">;</span>
   <span class="token comment">//Getters</span>
   <span class="token comment">//Setters</span>
<span class="token punctuation">}</span>
</div>

Taxi_Car.java

<div class="code-mirror  language-java" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token keyword">package</span> <span class="token namespace">com<span class="token punctuation">.</span>tutorialspoint</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">javax<span class="token punctuation">.</span>persistence<span class="token punctuation">.</span></span><span class="token operator">*</span><span class="token punctuation">;</span>
<span class="token annotation punctuation">@Entity</span>
<span class="token annotation punctuation">@DiscriminatorValue</span><span class="token punctuation">(</span><span class="token string">"taxicar"</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Taxi_Car</span> <span class="token keyword">extends</span> <span class="token class-name">Car</span><span class="token punctuation">{</span>
   <span class="token annotation punctuation">@Column</span><span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">"farePerKm"</span><span class="token punctuation">)</span>
   <span class="token keyword">private</span> <span class="token keyword">int</span> farePerKm<span class="token punctuation">;</span>

   <span class="token annotation punctuation">@Column</span><span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">"available"</span><span class="token punctuation">)</span>
   <span class="token keyword">private</span> <span class="token keyword">boolean</span> available<span class="token punctuation">;</span>
   <span class="token comment">//Getters</span>
   <span class="token comment">//Setters</span>
<span class="token punctuation">}</span>
</div>

2. Hibernate Configuration file (hibernate.cfg.xml)

<div class="code-mirror  language-html" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token doctype"><span class="token punctuation"><!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">hibernate-configuration</span> <span class="token name">PUBLIC</span>
   <span class="token string">"-//Hibernate/Hibernate Configuration DTD 3.0//EN"</span>
   <span class="token string">"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>hibernate-configuration</span><span class="token punctuation">></span></span>
   <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>session-factory</span><span class="token punctuation">></span></span>
      <span class="token comment"><!-- JDBC Database connection settings --></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>connection.driver_class<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>com.mysql.cj.jdbc.Driver<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>property</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>connection.url<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>jdbc:mysql://localhost:3306/demo?useSSL=false<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>property</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>connection.username<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>root<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>property</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>connection.password<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>root<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>property</span><span class="token punctuation">></span></span>
      <span class="token comment"><!-- JDBC connection pool settings ... using built-in test pool --></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>connection.pool_size<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>4<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>property</span><span class="token punctuation">></span></span>
      <span class="token comment"><!-- Echo the SQL to stdout --></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>show_sql<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>property</span><span class="token punctuation">></span></span>
      <span class="token comment"><!-- Select our SQL dialect --></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>dialect<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>org.hibernate.dialect.MySQL5Dialect<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>property</span><span class="token punctuation">></span></span>
      <span class="token comment"><!-- Drop and re-create the database schema on startup --></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>hbm2ddl.auto<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>create-drop<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>property</span><span class="token punctuation">></span></span>
      <span class="token comment"><!-- name of annotated entity class --></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>mapping</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>com.tutorialspoint.Car<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>mapping</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>com.tutorialspoint.Sports_Car<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>mapping</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>com.tutorialspoint.Taxi_Car<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
   <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>session-factory</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>hibernate-configuration</span><span class="token punctuation">></span></span>
</div>

3. Code to create a table and store the data

<div class="code-mirror  language-java" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token keyword">package</span> <span class="token namespace">com<span class="token punctuation">.</span>tutorialspoint</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>hibernate<span class="token punctuation">.</span></span><span class="token class-name">Session</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>hibernate<span class="token punctuation">.</span></span><span class="token class-name">SessionFactory</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>hibernate<span class="token punctuation">.</span></span><span class="token class-name">Transaction</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>hibernate<span class="token punctuation">.</span>cfg<span class="token punctuation">.</span></span><span class="token class-name">Configuration</span><span class="token punctuation">;</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">StoreTest</span> <span class="token punctuation">{</span>
   <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span> args<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
      <span class="token class-name">SessionFactory</span> sessionFactory <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Configuration</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
         <span class="token punctuation">.</span><span class="token function">configure</span><span class="token punctuation">(</span><span class="token string">"com/tutorialspoint/hibernate.cfg.xml"</span><span class="token punctuation">)</span>
         <span class="token punctuation">.</span><span class="token function">buildSessionFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token class-name">Session</span> session<span class="token operator">=</span>sessionFactory<span class="token punctuation">.</span><span class="token function">openSession</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token class-name">Transaction</span> t<span class="token operator">=</span>session<span class="token punctuation">.</span><span class="token function">beginTransaction</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token class-name">Car</span> c1<span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">Car</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      c1<span class="token punctuation">.</span><span class="token function">setName</span><span class="token punctuation">(</span><span class="token string">"Mercedes"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      c1<span class="token punctuation">.</span><span class="token function">setColor</span><span class="token punctuation">(</span><span class="token string">"Black"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      
      <span class="token class-name">Sport_Car</span> c2<span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">Sport_Car</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      c2<span class="token punctuation">.</span><span class="token function">setName</span><span class="token punctuation">(</span><span class="token string">"Porsche"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      c2<span class="token punctuation">.</span><span class="token function">setColor</span><span class="token punctuation">(</span><span class="token string">"Red"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      c2<span class="token punctuation">.</span><span class="token function">setMileage</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      c2<span class="token punctuation">.</span><span class="token function">setCost</span><span class="token punctuation">(</span><span class="token number">5000000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      
      <span class="token class-name">Taxi_Car</span> c3<span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">Taxi_Car</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      c3<span class="token punctuation">.</span><span class="token function">setName</span><span class="token punctuation">(</span><span class="token string">"Innova"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      c3<span class="token punctuation">.</span><span class="token function">setColor</span><span class="token punctuation">(</span><span class="token string">"White"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      c3<span class="token punctuation">.</span><span class="token function">setFarePerKm</span><span class="token punctuation">(</span><span class="token number">7</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      c3<span class="token punctuation">.</span><span class="token function">setAvailable</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      
      session<span class="token punctuation">.</span><span class="token function">persist</span><span class="token punctuation">(</span>c1<span class="token punctuation">)</span><span class="token punctuation">;</span>
      session<span class="token punctuation">.</span><span class="token function">persist</span><span class="token punctuation">(</span>c2<span class="token punctuation">)</span><span class="token punctuation">;</span>
      session<span class="token punctuation">.</span><span class="token function">persist</span><span class="token punctuation">(</span>c3<span class="token punctuation">)</span><span class="token punctuation">;</span>
      
      t<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      session<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</div>

MySQL Table

Updated on: 2022-08-26T11:47:53+05:30

1K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements