Hibernate Tutorial

Hibernate Inheritance mapping Single table per class hierarchy example annotation based

The single table inheritance strategy maps all subclasses to only one database table. Each subclass declares its own persistent properties. Version and id properties are assumed to be inherited from the root class.
The discriminator column contains marker values that tell the persistence layer what subclass to instantiate for a particular row.
POJO
Book.java
package com.candidjava.hibernate;
 
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
 
@Entity  
@Table(name = "book")  
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue(value="book")
public class Book {
  @Id  
  @GeneratedValue(strategy=GenerationType.AUTO)  
    int id;
  @Column(name = "title") 
    String title;
    @Column(name = "author")  
    String author;
    @Column(name = "cost")  
    double cost;
 
    public Book() {
    }
    public Book(String title, String author,double cost) {
      this.title = title;
      this.author = author;   
      this.cost = cost;
    }
    public void setId(int id) { 
      this.id = id;
    }
    public int getId(){ 
      return id;
    }
    public void setTitle(String title) { 
      this.title = title;
    }
    public String getTitle() { 
      return title;
    }
    public void setAuthor(String author) { 
       this.author = author;
    }
    public String getAuthor() { 
      return author;
    }
    public void setCost(double cost) { 
      this.cost = cost;
    }
    public double getCost() { 
      return cost;
    }
  }

 

International Book
InternationalBook.java
package com.candidjava.hibernate;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue(value="internationalbook")
public class InternationalBook extends Book {
    @Column(name="language")    
  private String languages;
    @Column(name="region")
  private int region;
 
  public InternationalBook() {
  }
  public InternationalBook(String title, String author, double cost,
      String language, int region) {
    super(title, author, cost);
    languages = language;
    this.region = region;
  }
  public void setLanguages(String s) {
    languages = s;
  }
  public String getLanguages() {
    return languages;
  }
  public void setRegion(int i) {
    region = i;
  }
  public int getRegion() {
    return region;
  }
}

 

Special Edition Book
SpecialEditionBook.java
package com.candidjava.hibernate;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue(value="specialeditionbook")
public class SpecialEditionBook extends Book {
 
  @Column(name="newfeatures")
  private String newfeatures;
  public SpecialEditionBook() {
  }
  public SpecialEditionBook(String title, String author, double cost,
      String features) {
    super(title, author, cost);
    newfeatures = features;
  }
  public void setNewfeatures(String s) {
    newfeatures = s;
  }
  public String getNewfeatures() {
    return newfeatures;
  }
}

Inserting record into Single table per class

public void insertBook(Book bk) {
    try {
      Session s = getSession();
      Transaction transaction = s.beginTransaction();
      s.save(bk);
      transaction.commit();
    } catch (HibernateException e) {
      e.printStackTrace();
    }
  }

Test to insert record into Single table per class

package com.candidjava.hibernate;
public class TestInsertBook {
  public static void main(String arg[])
  {
    try
    {
    BookDao m=new BookDao();
    Book bk=new Book();
    bk.setAuthor("sivaraman");
    bk.setCost(760);
    bk.setTitle("oracle");
    
    
    InternationalBook ib=new InternationalBook();
    ib.setAuthor("siva");
    ib.setCost(1000);
    ib.setTitle("Spring");
    ib.setLanguages("english");
    ib.setRegion(12);
    
    SpecialEditionBook sb=new SpecialEditionBook();
    sb.setAuthor("sivasamy");
    sb.setTitle("j2ee");
    sb.setNewfeatures("webservices");
    sb.setCost(1000);
    m.insertBook(bk);
    m.insertBook(ib);
    m.insertBook(sb);
    }
    catch(Exception e)
    {
      System.out.println(e);
    }
  }
 
}

Retrieving or getting record from Single table per class

public Book getBook(int id) {
    Book sd = null;
    try {
      Session s = getSession();
      sd = (Book) s.get(Book.class, id);
        } catch (HibernateException e) 
    {
      System.out.println(e.getMessage());
    }
    return sd;
  }

Test to Retrieve or get record from Single table per class

package com.candidjava.hibernate;
 
public class TestGetBook {
  public static void main(String arg[]) {
    BookDao ms = new BookDao();
 
    Book b = ms.getBook(1);
 
    System.out.println(b.getAuthor());
    System.out.println(b.getTitle());
    System.out.println(b.getCost());
 
    if (b instanceof InternationalBook) {
      InternationalBook ib = (InternationalBook) b;
      System.out.println(ib.getLanguages());
      System.out.println(ib.getRegion());
    }
    if (b instanceof SpecialEditionBook) {
      SpecialEditionBook sb = (SpecialEditionBook) b;
      System.out.println(sb.getNewfeatures());
 
    }
 
  }
 
}
Download