WEB开发网
开发学院软件开发Java 持久化模式,第 2 部分: 提高代码重用和改进性能 阅读

持久化模式,第 2 部分: 提高代码重用和改进性能

 2010-04-02 00:00:00 来源:WEB开发网   
核心提示: 如果把工资计算代码放在领域实体中,就会产生更紧凑的领域模型,持久化模式,第 2 部分: 提高代码重用和改进性能(2),而且避免把逻辑分散在各层中,工资支付方式示例使用单一表继承,Hibernate 会在查询中加上 employeeType="Salary",这样就能够获得所需

如果把工资计算代码放在领域实体中,就会产生更紧凑的领域模型,而且避免把逻辑分散在各层中。工资支付方式示例使用单一表继承。为此,首先需要定义一个识别器(discriminator) — 识别器是表中的一列,它告诉 Hibernate 为了表示数据库中的数据应该实例化的对象类型。对于这个示例,employeeType 列作为识别器。接下来,必须定义超类,这个类作为这些实体的基类 — 这个示例使用抽象类 PayRate。清单 1 给出这个超类的注解和类声明:

清单 1. 超类的注解和类声明

        @Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn( name="employeeType", discriminatorType=DiscriminatorType.STRING ) 
public abstract class PayRate extends BaseEntity{//...} 

最后,需要为每个可能的子类创建实现。清单 2 为周薪制职员和小时制职员定义了子类:

清单 2. 子类的定义

        @Entity 
@DiscriminatorValue("Salary") 
public class SalaryPayRate extends PayRate {//...} 
 
@Entity 
@DiscriminatorValue("Hourly") 
public class HourlyPayRate extends PayRate {//...} 

在查询 PayRate 表时,如果 employeeType="Salary",Hibernate 就自动创建 SalaryPayRate 的实例;如果 employeeType="Hourly",就创建 HourlyPayRate 的实例。然后,应用程序代码可以调用 createPayCheck 方法,并确保用正确的算法计算工资。Hibernate 作为这些类的工厂,它会在正确的时间创建正确的实例。

在编写查询时,Hibernate 还能够感知多态性。在编写寻找所有周薪制职员的查询时,Hibernate 会在查询中加上 employeeType="Salary",这样就能够获得所需的结果。清单 3 给出一个多态性查询示例;注意,这个查询并没有什么特殊之处:

上一页  1 2 3 4 5 6 7  下一页

Tags:持久化 模式 部分

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接