hibernate的继承映射(Inheritance Mapping)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

继承映射(Inheritance Mapping)

10.1. 三种策略

10.1.1. 每个类分层结构一张表(Table per class hierarchy)

10.1.2. 每个子类一张表(Table per subclass)

10.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator)

10.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表”

10.1.5. 每个具体类一张表(Table per concrete class)

10.1.6. 每个具体类一张表,使用隐式多态

10.1.7. 隐式多态和其他继承映射混合使用

10.2. 限制

10.1. 三种策略

Hibernate 支持三种基本的继承映射策略:

每个类分层结构一张表(table per class hierarchy)

table per subclass

每个具体类一张表(table per concrete class)

此外,Hibernate 还支持第四种稍有不同的多态映射策略:

隐式多态(implicit polymorphism)

对于同一个继承层次内的不同分支,可以采用不同的映射策略,然后用隐式多态来完成跨越整个层次的多态。但是在同一个 根元素下,Hibernate 不支持混合了元素 的映射。在同一个 元素下,可以混合使用“每个类分层结构一张表”(table per hierarchy)和“每个子类一张表”(table per subclass)这两种映射策略,这是通过结合元素 来实现的(见后)。

在多个映射文件中,可以直接在hibernate-mapping 根下定义subclass,union-subclass 和joined-subclass。也就是说,你可以仅加入一个新的映射文件来扩展类层次。你必须在subclass 的映射中指明extends 属性,给出一个之前定义的超类的名字。注意,在以前,这一功能对映射文件的顺序有严格的要求,从Hibernate 3 开始,使用extends 关键字的时侯,对映射文件的顺序不再有要求;但在每个映射文件里,超类必须在子类之前定义。

>

10.1.1. 每个类分层结构一张表(Table per class hierarchy)

假设我们有接口Payment和它的几个实现类:CreditCardPayment, CashPayment 和ChequePayment。则“每个类分层结构一张表”(Table per class hierarchy)的映射代码如下所示:

...

...

...

...

>

采用这种策略只需要一张表即可。它有一个很大的限制:要求那些由子类定义的字段,如CCTYPE,不能有非空(NOT NULL)约束。

10.1.2. 每个子类一张表(Table per subclass)

对于上例中的几个类而言,采用“每个子类一张表”的映射策略,代码如下所示:

...

...

相关文档
最新文档