其中ID为1和2的记录的EMPLOYEE_TYPE字段的取值为"HE",因此它们对应HourlyEmployee类的实例,其中ID为3和4的记录的EMPLOYEE_TYPE字段的取值为"SE",因此它们对应SalariedEmployee类的实例。
这种映射方式要求EMPLOYEES表中和子类属性对应的字段允许为null,例如ID为1和2的记录的SALARY字段为null,而ID为3和4的记录的RATE字段为null。如果业务需求规定SalariedEmployee对象的rate属性不允许为null,显然无法在EMPLOYEES表中为SALARY字段定义not null约束,可见这种映射方式无法保证关系数据模型的数据完整性。
由于HourlyEmployee类和SalariedEmployee类没有单独的映射文件,因此在初始化Hibernate时,只需向Configuration对象中加入Company类和Employee类:
Configuration config = new Configuration();
config.addClass(Company.class)
.addClass(Employee.class);
|
如果Employee类不是抽象类,即它本身也能被实例化,那么可以在元素中定义它的discriminator值,形式如下:
<class name="mypack.Employee"
table="EMPLOYEES"
discriminator-value="EE">
|
以上代码表明,如果EMPLOYEES表中一条记录的EMPLOYEE_TYPE字段的取值为"EE",那么它对应Employee类本身的实例。
14.2.2 操纵持久化对象
这种映射方式支持多态查询,对于以下查询语句:
List employees=session.find("from Employee");
|
Hibernate会检索出所有的HourlyEmployee对象和SalariedEmployee对象。此外,也可以单独查询Employee类的两个子类的实例,例如:
List hourlyEmployees=session.find("from HourlyEmployee");
|
<<上一页
1
2
3
4
5
下一页>>
|