Trouxe um exemplo mais complexo para debate.
Imaginem um software que precisa guardar o relacionamento de 3 entidades. E duas delas estão generalizadas a partir de uma outra entidade.
O cenário é: Um software de consulta médica. Onde temos a entidade do médico, do paciente (ambas generalizam uma pessoa) e a própria consulta.
Eu fiz da seguinte maneira:
@Entity
@Table (name= "person")
public abstract class Person {
    @Id @GeneratedValue
    protected Long id;
    protected String name;
    protected String email;
    protected String password;
    @OneToOne
    protected Address address;@Entity
@Table
public class Client extends Person{
    @OneToMany(mappedBy = "client")
    private List<MedicalConsultation> medicalConsultations;@Entity
@Table
public class Doctor extends Person{
    @OneToMany(mappedBy="doctor")
    private List<MedicalConsultation> medicalConsultations;
@Entity
@Table(name="medical_consultation")
public class MedicalConsultation {
    @Id @GeneratedValue
    private Long id;
    @OneToOne
    private Doctor doctor;
    @OneToOne
    private Client client;
    @JsonFormat(pattern="dd/MM/yyyy hh:mm")
    private Date date;Considerando a herança e as composições bidirecionais, vocês acham que isso está correto?
PS.: Qual a diferença entre @Table e @Entity ?
 
            