Hibernate:继承映射到Legacy-Database

时间:2012-11-27 12:00:06

标签: java hibernate orm

我在尝试将旧版Oracle数据库映射到Hibernate时遇到了一些问题。更具体地说,我无法获得正确的继承映射。我一直在使用的例子是Person-Employee-Relationship。在我们的数据库中,表是分开的,因此唯一的映射策略将被加入。现在的问题是Employee的PK由EmployeeId和CompanyId组成,PersonId只是普通的FK。如果不搞砸当前正在运行的系统,就没有办法改变它 以下是Person和Employee的当前代码:

Person.class

@Entity
@Table (name = "personas")
@Inheritance (strategy = InheritanceType.JOINED)
public class Person {
    private String personId;
    private boolean physical;
    private String name;
    private String fantasyName;
    private char gender;

    @Id
    @Column (name = "cod_persona")
    public String getPersonId() {
        return personId;
}

    public void setPersonId(String personId) {
        this.personId = personId;
    }

    //rest of setters and getters
}

Employee.class:

@Entity
@Table (name = "rh_empleados")
@PrimaryKeyJoinColumn (name = "cod_persona")
public class Employee extends Person {
    private Company company;
    private String employeeId;
    private Integer finalSalary;
    private Branch branch;

    @Basic (optional = false)
    @ManyToOne
    @JoinColumn (name = "cod_empresa")
    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

    @Basic (optional = false)
    @Column (name = "cod_empleado")
    public String getEmployeeId() {
        return employeeId;
}

    public void setEmployeeId(String employeeId) {
        this.employeeId = employeeId;
    }

    //rest of setters and getters
}

已经有效的方法:创建或删除新员工或个人 什么行不通:选择已经存在的员工或人员,我没有例外,或者什么事情都没有返回任何内容。

它必须与继承有关,因为另一个实体不在继承层次结构中,它可以很好地工作。

任何提示/想法/解决方法或我搞砸了?
Everthing将不胜感激 提前谢谢。

编辑:显然创建或删除员工现在无论哪种方式更有意义。我得到了“无法转换为内部代表”。

1 个答案:

答案 0 :(得分:1)

这确实是个烦人的问题!

一种解决方案是不将Employee-Person关系建模为继承。他们的主要钥匙的差异与此相反。

相反,您可以将其建模为组合,其中是员工has a人。如果您希望能够更统一地处理员工和人员,那么您可以定义如下界面:

public interface Individual {
    public Person self();
}

通过Person实现:

    public Person self() {
        return this;
    }

和员工:

    public Person self() {
        return person;
    }

虽然这有点奇怪。