Hibernate实战_笔记28(每个带有联合的具体类一张表)
2014-03-27 23:06
405 查看
每个带有联合的具体类一张表
使用<union-subclass>继承策略<hibernate-mapping package="cn.jbit.hibernate.entity2"> <class name="BillingDetails2" abstract="true"> <id name="id" column="BILLING_DETAILS_ID" type="integer"> <generator class="native"/> </id> <property name="owner"> <column name="OWNER" not-null="true"/> </property> <union-subclass name="CreditCard2" table="CREDIT_CARD"> <property name="number" column="CC_NUMBER" length="20" not-null="true"/> <property name="expMonth" column="EXP_MONTH" length="20" not-null="true"/> <property name="expYear" column="EXP_YEAR" length="20" not-null="true"/> </union-subclass> </class> </hibernate-mapping>你可能注意到了,这种策略的第一个好处是超类(或者接口)属性的共享声明。你不再非得给所有具体的类复制这些映射了——Hibernate会替你完成。记住,SQL模式仍然不知道继承;实际上,我们已经把两个不相关的表映射到了一个更富有表现力的类结构。
在JPA注解中,这个策略称作TABLE_PER_CLASS
@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class BillingDetails3 { @Id @GeneratedValue @Column(name = "BILLING_DETAILS_ID", nullable = false) private Integer id; @Column(name = "OWNER", nullable = false) private String owner; }数据库标识符和它的映射必须出现在超类中。
@Entity @Table(name = "CREDIT_CARD2") public class CreditCard3 extends BillingDetails3 { @Column(name = "CC_NUMBER", nullable = false) private String number; @Column(name = "EXP_MONTH", nullable = false) private String expMonth; @Column(name = "EXP_YEAR", nullable = false) private String expYear; }注意,TABLE_PER_CLASS在JPA标准中被指定为可选,因此并非所有的JPA实现都可以支持它。实际的实现也是由供应商决定的——在Hibernate中,它相当于XML文件中的<union-subclass>映射。
同样的映射在JPA XML描述符中看起来像这样:
<entity class="cn.jbit.hibernate.entity2.BillingDetails2" access="FIELD"> <inheritance strategy="TABLE_PER_CLASS"/> <attributes> <id name="id"> <column name="BILLING_DETAILS_ID" nullable="false"/> <generated-value strategy="AUTO"/> </id> <basic name="owner"> <column name="OWNER" nullable="false"/> </basic> </attributes> </entity> <entity class="cn.jbit.hibernate.entity2.CreditCard2" access="FIELD"> <attributes> <basic name="number"> <column name="CC_NUMBER" nullable="false"/> </basic> <basic name="expMonth"> <column name="EXP_MONTH" nullable="false"/> </basic> <basic name="expYear"> <column name="EXP_YEAR" nullable="false"/> </basic> </attributes> </entity>如果超类是具体的,就需要另外一张表来存放这个类的实例。必须再次强调,数据库表之间仍然没有关系,除了它们共享一些类似的列之外。如果检验多态查询,这个映射策略的好处会更加明显。
相关文章推荐
- Hibernate实战_笔记27(每个带有隐式多态的具体类一张表)
- Hibernate映射类继承之每个带有联合的具体类一张表(每个子类各一张表,共用一个父类映射文件)
- Hibernate实战_笔记29(每个类层次结构一张表)
- Hibernate学习笔记:每个具体的类一张表
- Hibernate映射类继承之每个带有隐式多态的具体类一张表(每个子类各一张表,有各自的映射文件)
- 十四、Hibernate实体映射(每个具体类映射成一张表)
- 【SSH快速进阶】——Hibernate继承映射:每个具体类映射一张表
- Hibernate实战_30(每个子类一张表)
- hibernate继承关系映射方法(三)--每个具体类一张表TPC
- Hibernate学习笔记:继承映射之每个子类一张表
- hibernate继承映射关系 —— 每个具体类映射成一张表
- Hibernate学习笔记:继承映射之每个类继承结构一张表
- hibernate继承映射之每个具体类一张表
- hibernate继承映射策略之每个具体类一张表
- Hibernate 继承映射实现方式之每个具体类对应一张表
- Hibernate继承映射之每个具体类一张表
- Hibernate学习笔记:继承映射之每个子类一张表,使用辨别标志
- hibernate之多态关联(多态的多对一,利用any,使用每个具体类一张表的策略)
- Hibernate学习笔记:混合使用每个继承结构一张表 和 每个子类一张表
- Hibernate实战_笔记25(细粒度的模型和映射)