Потратив столько времени на это и не получив никакого ответа, я пришел к этому решению (которое может быть не самым лучшим):
@Entity
public abstract class A implements Serializable {
@Id
public Long id;
public String a1;
public String a2;
public String a3;
//much more fields
//getters and setters
}
@Entity
public class B implements Serializable {
@Id
@Column(name="id", nullable=false)
public Long id;
@MapsId
@OneToOne(optional=false)
@JoinColumn(name="id")
public A a;
public String b1;
public String b2;
public String b3;
//much more fields
//getters and setters
}
@Entity
public class C extends A {
public String c;
//that's it. no more data
//getters and setters
}
Заключение
Я был поражен тем, как такая хорошо поддерживаемая и популярная технология, как JPA, не предлагает решения для такого тривиального случая. Как указал Паскаль Тивент в своем ответе на этот вопрос, Hibernate обманывает нас, используя secondary table
, что является очень утомительным и подверженным ошибкам подходом (вы должны вручную указать для каждого поля, к какой таблице оно принадлежит). Похоже, что в JPA spec.
еще есть возможности для улучшения