私は次のモデル、Person を持っています。これは、Patient と Practitioner のスーパー クラスです。Person オブジェクトはインスタンス化できますが、後で Practitioner または Patient のいずれかに変更できますが、サブクラス オブジェクトに変換すると、Hibernate は person テーブルに新しい行を作成します。これが私のクラス表現です。Person クラスでコピー コンストラクターを使用して、変換時に現在の person オブジェクトでサブクラス オブジェクトをインスタンス化しています。
@Entity
@Table(name="person")
@Inheritance(strategy = InheritanceType.JOINED)
public class Person extends BasePerson{
private Set<MedicalAidCard> medicalAidCards = new HashSet<MedicalAidCard>();
public Person() {
}
public Person(Person person) {
this.setActive(person.getActive());
this.setCity(person.getCity());
this.setCountry(person.getCountry());
this.setCreatedBy(person.getCreatedBy());
this.setDateCreated(person.getDateCreated());
this.setDateModified(person.getDateModified());
this.setDateOfBirth(person.getDateOfBirth());
this.setFirstName(person.getFirstName());
this.setGender(person.getGender());
this.setId(person.getId());
this.setLastName(person.getLastName());
this.setMaritalStatus(person.getMaritalStatus());
this.setMiddleName(person.getMiddleName());
this.setModifiedBy(person.getModifiedBy());
this.setRace(person.getRace());
this.setTitle(person.getTitle());
this.setVersion(person.getVersion());
}
@JsonIgnore
@ManyToMany
@JoinTable(name="card_person", joinColumns=@JoinColumn(name="person_id"),
inverseJoinColumns=@JoinColumn(name="card_id"))
public Set<MedicalAidCard> getMedicalAidCards() {
return medicalAidCards;
}
public void setMedicalAidCards(Set<MedicalAidCard> medicalAidCards) {
this.medicalAidCards = medicalAidCards;
}
@Transient
public Boolean getPatient(){
return this instanceof PersonPatient;
}
}
BasePerson は、基本的な個人の人口統計情報を含む @MappedSuperClass であることに注意してください
@Entity
@PrimaryKeyJoinColumn(name = "id")
@Table(name="patient")
public class PersonPatient extends Person{
private String fileNumber;
private String oldFileNumber;
private Date dateRegistered;
public PersonPatient() {
}
public PersonPatient(Person person) {
super(person);
}
@Column(name="file_number",unique=true)
public String getFileNumber() {
return fileNumber;
}
public void setFileNumber(String fileNumber) {
this.fileNumber = fileNumber;
}
@Temporal(TemporalType.DATE)
@Column(name="date_registered")
public Date getDateRegistered() {
return dateRegistered;
}
public void setDateRegistered(Date dateRegistered) {
this.dateRegistered = dateRegistered;
}
@Column(name="old_file_number")
public String getOldFileNumber() {
return oldFileNumber;
}
public void setOldFileNumber(String oldFileNumber) {
this.oldFileNumber = oldFileNumber;
}
@Override
public String toString() {
return super.getId().toString();
}
}
ちなみに、SpringData CrudRepository メソッドを使用して保存しています。Hibernate は JPA プロバイダーです。現在の人物を削除することを考えていましたが、現在の人物がすでに別のサブクラスを表している場合は機能しないことに気付きました。