0

私は次のモデル、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 プロバイダーです。現在の人物を削除することを考えていましたが、現在の人物がすでに別のサブクラスを表している場合は機能しないことに気付きました。

4

1 に答える 1

0

あなたがしたいことは不可能です。継承は適切なツールではありません。Hibernate のように Java では、オブジェクトには型があり、別のものになることはできないからです。

おそらく継承ではなく構成を使用してこれをモデル化する必要があります。ユーザーには実践的な役割があるか、ユーザーには患者の役割があります。

于 2013-03-05T08:25:11.773 に答える