Hibernate继承在转换为子类时更改超类对象时复制行

时间:2013-03-05 05:13:51

标签: hibernate jpa spring-mvc

我有以下模型,Person是患者和从业者的超级类。可以实例化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提供程序。我曾想过删除当前的人,但是我意识到如果当前的人已经代表另一个子类,它将无法工作。

1 个答案:

答案 0 :(得分:0)

你想做什么是不可能的。继承不是合适的工具,因为在Java中,就像在Hibernate中一样,对象有一个类型,不能成为别的东西。

您应该使用合成而不是继承对此进行建模:用户具有从业者角色,或者用户具有患者角色。