`
wangtong40
  • 浏览: 253052 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate的继承策略

    博客分类:
  • ORM
阅读更多

<!-- [if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- [if !mso]> <span class="mceItemObject" classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui> </span> <style> st1\:*{behavior:url(#ieooui) } </style> <![endif]--> <!-- [if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->

<!-- [if !supportLists]-->节 1.01   <!-- [endif]-->每个带有联合的具体类一张表 – union-class

<!-- [if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="_x0000_i1026" type="#_x0000_t75" style="width:401.25pt; height:129pt" mce_style="width:401.25pt; height:129pt"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image001.png" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image001.png" o:title="3"/> </v:shape><![endif]--><!-- [if !vml]--><!-- [endif]-->

    <!-- 注:抽象的超类或者接口必须声明为 abstract ,否则超类实例需要一张单独表 -->

    < class name = "hibernate.hierarchical.BillingDetails" abstract = "true" >

< union-subclass name = "hibernate.hierarchical.CreditCard" table = "CREDIT_CARD" >

           < property name = "number" column = "NUMBER" />

           < property name = "expMonth" column = "EXP_MONTH" />

           < property name = "expYear" column = "EXP_YEAR" />

       </ union-subclass >

       < union-subclass name = "hibernate.hierarchical.BankAccount" table = "BANK_ACCOUNT" >

           < property name = "account" column = "ACCOUNT" />

           < property name = "bankname" column = "BANKNAME" />

           < property name = "swift" column = "SWIFT" />

       </ union-subclass >

    </ class >

public class BillingDetails { private Long id ; private String owner ;}

public class BankAccount extends BillingDetails {

private String account ; private String bankname ; private String swift ;}

public class CreditCard extends BillingDetails {

private String number ; private String expMonth ; private String expYear ;}

 

查询 BillingDetails 时生成的 SQL 如下:

Select BILLING_DETAIL_ID,OWNER… FROM

(

       Select BILLING_DETAIL_ID_OWNER,NUMBER,EXP_MONTH,EXMP_YEAR,null as ACCOUNT,null AS BANKNAME,null as SWIFT 1 as CLAZZ_

FROM CREDIT_CARD

       UNION

Select BILLING_DETAIL_ID_OWNER,null as NUMBER,null as EXP_MONTH,null as EXP_YEAR,ACCOUNT,BANKNAME,SWIFT,2 as CLAZZ_

       FROM BANK_ACCOUNT

)

这样使用的效率最高

<!-- [if !supportLists]-->节 1.02   <!-- [endif]-->每个类层次结构一张表 – SubClass

<!-- [if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style="width:248.25pt;height:177.75pt" mce_style="width:248.25pt;height:177.75pt"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image003.png" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image003.png" o:title="2"/> </v:shape><![endif]--><!-- [if !vml]--><!-- [endif]-->

注:

<!-- [if !supportLists]-->1、  <!-- [endif]-->在表设计时添加辨别标志 (BILLING_DETAILS_TYPE) 用于在持久化类之间区分不同对象。

<!-- [if !supportLists]-->2、  <!-- [endif]-->在列名称设计上需要加前缀(比如 CC/BA )等,用于让 Hibernate 自动识别不同对象。

 

    < class name = "hibernate.hierarchical.BillingDetails" table = "Billing_Details" >

       < property name = "owner" column = "OWNER" type = "string" />

       <!-- 添加一个辨别标志以便在持久化类之间进行区分 -->

       < discriminator column = "BILLING_DETAILS_TYPE" type = "string" />

       < subclass name = "hibernate.hierarchical.CreditCard" discriminator-value = "CC" >

           < property name = "number" column = "CC_NUMBER" />

           < property name = "expMonth" column = "CC_EXP_MONTH" />

           < property name = "expYear" column = "CC_EXP_YEAR" />

       </ subclass >

       < subclass name = "hibernate.hierarchical.BankAccount" discriminator-value = "BA" >

           < property name = "account" column = "BA_ACCOUNT" />

           < property name = "bankname" column = "BA_BANKNAME" />

           < property name = "swift" column = "BA_SWIFT" />

       </ subclass >

    </ class >

public class BillingDetails { private Long id ; private String owner ;}

public class BankAccount extends BillingDetails {

private String account ; private String bankname ; private String swift ;}

public class CreditCard extends BillingDetails {

private String number ; private String expMonth ; private String expYear ;}

 

当查询父表 BillingDetails 时将 BILLING_DETAILS 表字段全部查询。

Select BILLING_DETAILS_ID,CC_NUMBER,CC_EXP_MONTH… FROM BILLING_DETAILS

当查询子表 BankAccount/CreditCard 表时通过标识字段进行限制。

Select BILLING_DETAILS_ID,CC_NUMBER,CC_EXP_MONTH FROM BILLING_DETAILS WHERE BILLING_DETAILS_TYPE=’CC’

注:当类继承关系比较多时,存在性能问题

 

<!-- [if !supportLists]-->节 1.03   <!-- [endif]-->每个子类一个表 – JoinSubClass

将一个表示逻辑的大表拆分成多个子表,每个子表通过主键 / 外键的关系同父表进行关联,从而形成继承关系。每个子表的主键同时时父表的外键

<!-- [if gte vml 1]><v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:414.75pt;height:258pt" mce_style="width:414.75pt;height:258pt"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image005.png" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image005.png" o:title="1"/> </v:shape><![endif]--><!-- [if !vml]--><!-- [endif]-->

< class name = "hibernate.hierarchical.BillingDetails" table = "BillingDetails" >

< joined-subclass name = "hibernate.hierarchical.CreditCard" table = "CREDIT_CARD" >

<!-- 通过 key 指定的字段将父表和子表关联。 CREDIT_CARD_ID 即使子表的主键同时也是父表的外键 -->

           < key column = "CREDIT_CARD_ID" />

           < property name = "number" column = "NUMBER" />

           < property name = "expMonth" column = "EXP_MONTH" />

           < property name = "expYear" column = "EXP_YEAR" />

       </ joined-subclass >

       < joined-subclass name = "hibernate.hierarchical.BankAccount" table = "BANK_ACCOUNT" >

           < key column = "BANK_ACCOUNT_ID" />

           <

分享到:
评论

相关推荐

    Hibernate数据关联映射与继承策略

    **Hibernate继承策略** 在 Hibernate 中,为了处理对象模型中的继承关系,提供了以下几种继承策略: 1. **单表继承(Single Table Inheritance)**:所有子类共享同一张数据库表,使用一个标识字段来区分不同的...

    Hibernate继承映射(annotation)

    ### Hibernate继承策略 Hibernate支持多种继承映射策略,包括: 1. **单表继承(Single Table Inheritance)**:所有的子类信息存储在同一个表中,通过一个特定的字段来区分不同的子类。 2. **类表继承(Class ...

    Hibernate继承映射代码

    Hibernate提供了四种继承策略:单表继承(Single Table Inheritance)、联合继承( Joined Table Inheritance)、表 per 类继承(Table per Class Inheritance)以及分层继承(Concrete Table Inheritance)。...

    Hibernate继承映射的第一种策略:每棵类继承树对应一张表

    本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承策略。 ### 单一表继承策略 在单一表继承策略中,所有类层次结构中的实例都存储在同一张数据库表中。这种策略通过在表中...

    jpa/hibernate继承注解

    以下是对"jpa/hibernate继承注解"这一主题的详细说明。 1. **单一表继承(Single Table Inheritance, STI)** 单一表继承是最简单的继承策略,所有的子类信息都存储在一个数据库表中。使用`@Inheritance(strategy ...

    用Hibernate映射继承关系

    Hibernate支持多种继承策略,包括单一表继承(Single Table Inheritance)、联合表继承( Joined Table Inheritance)和表-per类继承(Table per Class Inheritance)。每种策略都有其特定的适用场景和优缺点,下面...

    hibernate继承映射.rar

    《Hibernate继承映射详解》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。在实际项目中,我们常常会遇到类的继承关系,而Hibernate提供了强大的支持来处理这种继承关系的...

    Hibernate继承映射的第一种策略:每个具体类一张表

    本篇文章将详细探讨Hibernate继承映射的策略,特别是“每个具体类一张表”(Table Per Concrete Class)的映射方式。 在面向对象编程中,继承是常见的代码复用手段,但在关系型数据库中,这种概念并不直接对应。...

    Hibernate继承关系映射.pdf

    标题:“Hibernate继承关系映射.pdf” 描述:“简明扼要地介绍了Hibernate中继承关系的映射方式,深入探讨了三种不同的映射策略及其优缺点,同时解析了多态查询的概念。” 知识点: ### Hibernate继承关系映射...

    Hibernate继承映射的第一种策略:每个类对应一张表

    本文将详细探讨“Hibernate继承映射的第一种策略:每个类对应一张表”的概念、实现方式以及其优缺点。 首先,我们需要理解Hibernate继承映射的基本策略。在面向对象编程中,类继承是常见的代码复用手段,但在数据库...

    Hibernate继承映射-概述

    《Hibernate继承映射详解》 在Java开发中,对象关系映射(ORM)框架如...根据项目需求选择合适的继承策略,可以优化数据存储,提升系统性能。同时,结合源码学习,能更深入地理解其工作原理,为实际开发提供强大支持。

    Hibernate继承映射二:每个子类一张表

    这种方式也被称为单表继承或多表继承,是Hibernate支持的四种继承映射策略之一。了解并熟练掌握这种映射模式对于提升Java开发效率和代码维护性至关重要。 在传统的面向对象编程中,类可以有继承关系,但在关系...

    (2)Hibernate3.2 中的类继承关系

    在Hibernate中配置类继承关系,我们需要在实体类上使用`@Inheritance`注解,并指定继承策略。例如,使用单表继承: ```java @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn...

    Hibernate实体对象继承的三种方法

     hibernate继承策略总共有三种,一种是共用一张表;一种是每个类一张表,表里面储存子类的信息和父类的信息;还有一种是通过表连接的方式,每个类都有一张表,但是子类对应的表只保存自己的信息,父类对应的表保存...

Global site tag (gtag.js) - Google Analytics