1

我在尝试将我们的旧版 Oracle 数据库映射到 Hibernate 时遇到了一些问题。更具体地说,我无法让正确的继承映射工作。我一直在使用的示例是人员-员工-关系。在我们的数据库中,表是分开的,所以唯一的 Mapping-Strategy 将被加入。现在的问题是 Employee 的 PK 由 EmployeeId 和 CompanyId 组成,而 PersonId 只是一个普通的 FK。如果不破坏当前运行的系统,就无法改变这一点。
这是 Person 和 Employee 的当前代码:

人物类

@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
}

员工类:

@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
}

已经有效的方法:创建或删除新员工或人员 无效的方法:选择已经存在的员工或人员,我没有遇到异常,或者某些东西没有返回任何内容。

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

任何提示/想法/解决方法还是我搞砸了?
一切将不胜感激。
提前致谢。

编辑:显然现在创建或删除员工也不起作用,这更有意义。我收到“无法转换为内部表示”。

4

1 回答 1

1

这确实是一个烦人的问题!

一种解决方案是不将 Employee-Person 关系建模为继承。他们的主键的差异反对这一点。

相反,您可以将其建模为组合,其中 Employee有一个人。如果您希望能够更统一地处理员工和人员,那么您可以定义如下接口:

public interface Individual {
    public Person self();
}

通过 Person 实现:

    public Person self() {
        return this;
    }

和员工:

    public Person self() {
        return person;
    }

虽然这会有点奇怪。

于 2012-11-27T14:11:52.027 回答