2013-03-05 63 views
0

我有以下模型,Person是Patient和Practitioner的超類。 Person對象可以實例化,但是稍後可以將其更改爲Practitioner或Patient,但是在轉換爲子類對象時,Hibernate會在person表中創建一個新行。這是我的課堂表達。我正在使用Person類的拷貝構造函數在轉換時使用當前person對象實例化子類對象。Hibernate繼承在轉換爲子類時更改超類對象時複製行

@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", [email protected](name="person_id"), 
      [email protected](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是一個包含個人基本信息人口

@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提供商@MappedSuperclass。我曾經想過刪除當前的人,但是我意識到如果當前的人已經代表另一個子類,那麼它就行不通了。

回答

0

你想做什麼是不可能的。繼承不是合適的工具,因爲在Java中像Hibernate一樣,對象有一個類型,不能成爲別的東西。

你應該使用這個可能組成模式,而不是繼承:用戶 practitionar角色或用戶患者的作用。

+0

非常感謝你我改變了模型,現在工作正常 – Judge 2013-03-08 11:33:14