Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JPA @Entity Inheritance

I have been looking into JPA/Hibernate @Entity inheritance for a while now and can't seem to find anything that addresses what I am trying to achieve.

Basically I want to be able to define an @Entity with all of the column and table mappings as required. Then I want to be able to extend the @Entity in a number of different locations with different sets of @Transient methods defined in the body of each "sub-Entity". This is a basic example of what I am trying to achieve but with no success thus far:

@Entity
@Table(name = "mountain")
public class MountainEntityBase implements Serializable {
    public Integer mountainId = 0;
    public Integer height = 0;

    public List<ExplorerEntityBase> explorers = new ArrayList<ExplorerEntityBase>();

    @Id
    @GeneratedValue
    @Column(name = "mountain_id")
    public Integer getMountainId() { return mountainId; }
    public void setMountainId(Integer mountainId) { this.mountainId = mountainId; }

    @Column(name="height")
    public String getHeight() { return height; }
    public void setHeight(String height) { this.height = height; }

    @OneToMany(mappedBy="mountainId")
    public List<ExplorerEntityBase> getExplorers() { return this.explorers; }
    public void setExplorers(List<ExplorerEntityBase> explorers) { this.explorers = explorers; }

}    

.

@Entity
public class MountainEntity extends MountainEntityBase implements Serializable {

    public List<MountainEntity> allMountainsExploredBy = new ArrayList<MountainEntity>();

    @Transient
    public List<MountianEntity> getAllMountainsExploredBy(String explorerName){
        // Implementation 
    }
}

So any extended class will define only @Transients in its body. But also I want to allow for situations where the child class is empty:

@Entity
public class MountainEntity extends MountainEntityBase implements Serializable {
}

Thanks in advance for any help with this.

like image 510
travega Avatar asked May 29 '11 21:05

travega


People also ask

What is a JPA inheritance?

JPA Inheritence Overview Inheritence is a key feature of object-oriented programming language in which a child class can acquire the properties of its parent class. This feature enhances reusability of the code. The relational database doesn't support the mechanism of inheritance.

How many inheritance mapping strategies are there in JPA?

JPA and Hibernate support 4 inheritance strategies which map the domain objects to different table structures.

Which JPA inheritance strategies require discriminator column?

Only SINGLE_TABLE inheritance hierarchies require a discriminator column and values. JOINED hierarchies can use a discriminator to make some operations more efficient, but do not require one. TABLE_PER_CLASS hierarchies have no use for a discriminator.


1 Answers

Inheritance in JPA is specified on the root entity using the @Inheritance annotation. There you can specify the database representation of the hierarchy. Check the documentation for more details.

If your child classes define only transient fields (not methods) (i.e. not saved in the db), then perhaps a discriminator column is the best option. But it may be the case that you don't actually need inheritance - the main entity can have all the methods (because it has all the fields the methods operate on)

like image 193
Bozho Avatar answered Sep 24 '22 00:09

Bozho