Overriding @Id defined in a @MappedSuperclass with JPA

Sushant picture Sushant · Apr 29, 2015 · Viewed 7k times · Source

I have a class AbstractEntity that is extended by all the entities in my application and basically acts as an Identifier provider.

@MappedSuperclass
public class AbstractEntity implements DomainEntity {

    private static final long serialVersionUID = 1L;

    /** This object's id */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected long id;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="creation_date", nullable = false, updatable=false)
    private Date creationDate = new Date();

    /**
     * @return the id
     */
    public long getId() {
        return this.id;
    }

    /**
     * @param id the id to set
     */
    public void setId(long id) {
        this.id = id;
    }
}

I have a case now where I need to define a separate Id for couple of my Entity classes as these need to have a custom Sequence Generator. How can this be achieved?

@Entity
@Table(name = "sample_entity")
public class ChildEntity extends AbstractChangeableEntity {

    @Column(name = "batch_priority")
    private int priority;

    public int getPriority() {
        return priority;
    }

    public void setPriority(int priority) {
        this.priority = priority;
    }

}

Answer

Vlad Mihalcea picture Vlad Mihalcea · Apr 29, 2015

You can't do it, as demonstrated by this GitHub example.

Once you define the @Id in a base class you won't be able to override it in a sub-class, meaning it's better to leave the @Id responsibility to each individual concrete class.

For more details about this topic, check out this article.