Joined: Tue Mar 27, 2007 10:55 pm Posts: 2103 Location: Earth Has thanked: 39 time Have thanks: 56 time
In this case there is a table for each subclass in the class model .The table for subclass only contains the properties that are defined in the subclasses . To do this you will need changes in code from the single table inheritance example. There is no discriminator in the subclasses . In the super class you will need to change the inheritance type to JOINED . This technique still support polymorphism.
Code:
@Inheritance(strategy=InheritanceType.JOINED)
JOINED , means there must be a join relation between the tables . The id of the super class is used as Foreign key in the database tables of the subclasses in the JPA class model .
Another thing , @Table annotation is added to subclasses entities , because it is now related to a tables .
Code:
package com.codemiles.jpa;
import java.io.Serializable;
import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorType; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; @Entity @Table(name="SHAPE") @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="TYPE",discriminatorType=DiscriminatorType.STRING) public class Shape implements Serializable{ /** * */ private static final long serialVersionUID = 1L; @Id protected int id; protected int scale; protected float rotate; protected String colour; protected String points; protected int numOfPoints; public Shape(){ id=(int)System.currentTimeMillis(); } @Column(name="SHAPE_ID") public int getId(){ return id; }
public void setId(int id){ this.id = id; } @Column(name="SCALE") public int getScale(){ return scale; }
public void setScale(int scale){ this.scale = scale; } @Column(name="ROTATE") public float getRotate(){ return rotate; }
public void setRotate(float rotate){ this.rotate = rotate; } @Column(name="POINTS") public String getPoints(){ return points; }
public void setPoints(String points){ this.points = points; } public void setColour(String colour){ this.colour = colour; } @Column(name="COLOUR") public String getColour(){ return colour; } public void setNumOfPoints(int numOfPoints){ this.numOfPoints = numOfPoints; } @Column(name="NUM_POINTS") public int getNumOfPoints(){ return numOfPoints; } }
@Entity @Table(name="CIRCLE") public class Circle extends Shape implements Serializable{ /** * */ private static final long serialVersionUID = 1L; protected float radius;
public Circle(){ super(); numOfPoints =1 ; }
public void setRadius(float radius){ this.radius = radius; }
@Column(name="RADIUS") public float getRadius(){ return radius; } }