Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When to use DiscriminatorValue annotation in hibernate

What and when is the best scenario to use DiscriminatorValue annotation in hibernate?

like image 220
czetsuya Avatar asked May 27 '13 11:05

czetsuya


People also ask

What is DiscriminatorValue?

Annotation Type DiscriminatorValueSpecifies the value of the discriminator column for entities of the given type. The DiscriminatorValue annotation can only be specified on a concrete entity class.

What is the use of @DiscriminatorColumn?

The discriminator column is always in the table of the base entity. It holds a different value for records of each class, allowing the JPA runtime to determine what class of object each row represents. The DiscriminatorColumn annotation represents a discriminator column.

Which inheritance strategy is better in hibernate?

Single Table. The single table strategy maps all entities of the inheritance structure to the same database table. This approach makes polymorphic queries very efficient and provides the best performance.

What is the use of @entity annotation in hibernate?

@Entity annotation marks this class as an entity. @Table annotation specifies the table name where data of this entity is to be persisted. If you don't use @Table annotation, hibernate will use the class name as the table name by default.


2 Answers

These 2 links help me understand the inheritance concept the most:

http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

http://www.javaworld.com/javaworld/jw-01-2008/jw-01-jpa1.html?page=6

To understand discriminator, first you must understand the inheritance strategies: SINGLE_TABLE, JOINED, TABLE_PER_CLASS.

Discriminator is commonly used in SINGLE_TABLE inheritance because you need a column to identify the type of the record.

Example: You have a class Student and 2 sub-classes: GoodStudent and BadStudent. Both Good and BadStudent data will be stored in 1 table, but of course we need to know the type and that's when (DiscriminatorColumn and) DiscriminatorValue will come in.

Annotate Student class

@Entity @Table(name ="Student") @Inheritance(strategy=SINGLE_TABLE) @DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING,     name = "Student_Type") public class Student{      private int id;      private String name; } 

Bad Student class

@Entity @DiscriminatorValue("Bad Student") public class BadStudent extends Student{   //code here } 

Good Student class

@Entity @DiscriminatorValue("Good Student") public class GoodStudent extends Student{  //code here } 

So now the Student table will have a column named Student_Type and will save the DiscriminatorValue of the Student inside it.

----------------------- id|Student_Type || Name | --|---------------------| 1 |Good Student || Ravi | 2 |Bad Student  || Sham | ----------------------- 

See the links I posted above.

like image 162
czetsuya Avatar answered Sep 25 '22 11:09

czetsuya


Let me explain to you with an example . Suppose you have an class called Animal and under Animal class there are many subclasses like Reptile, Bird ...etc.

And in the database you have table called ANIMAL

--------------------------- ID||NAME      ||TYPE     || --------------------------- 1 ||Crocodile ||REPTILE  || --------------------------- 2 ||Dinosaur  ||REPTILE  || --------------------------- 3 ||Lizard    ||REPTILE  ||  --------------------------- 4 ||Owl       ||BIRD     || --------------------------- 5 ||parrot    ||BIRD     || --------------------------- 

Here the column TYPE is called DiscriminatorColumn , because this column contains data that clearly separates Reptiles and Birds. And the data REPTILE and BIRD in column TYPE are the DiscriminatorValue.

So in the java part this structure would look like :

Animal class:

@Getter @Setter @Table(name = "ANIMAL") @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "TYPE") public class Animal {      @Id     @Column(name = "ID")     private String id;      @Column(name = "NAME")     private String name;  } 

Reptile class :

@Entity @DiscriminatorValue("REPTILE") public class Reptile extends Animal {  } 

Bird class :

@Entity @DiscriminatorValue("BIRD") public class Bird extends Animal {  } 
like image 30
Joby Wilson Mathews Avatar answered Sep 24 '22 11:09

Joby Wilson Mathews