我在尝试将旧版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将不胜感激
提前谢谢。
编辑:显然创建或删除员工现在无论哪种方式更有意义。我得到了“无法转换为内部代表”。
答案 0 :(得分:1)
这确实是个烦人的问题!
一种解决方案是不将Employee-Person关系建模为继承。他们的主要钥匙的差异与此相反。
相反,您可以将其建模为组合,其中是员工has a人。如果您希望能够更统一地处理员工和人员,那么您可以定义如下界面:
public interface Individual {
public Person self();
}
通过Person实现:
public Person self() {
return this;
}
和员工:
public Person self() {
return person;
}
虽然这有点奇怪。