web进修之—Hibernate 继承映射(5)
2016-04-03 11:51
351 查看
先看三个类的继承关系,Payment是父类,CashPayment和CreditCardPayment是Payment的子类:
view plaincopy to clipboardprintpublic class Payment {
protected long id;
private String amount;
// setter,getter
}
public class CashPayment extends Payment {
private String cashType;
// setter,getter
}
public class CreditCardPayment extends Payment {
private String creditCardType;
// setter,getter
}
不论使用哪一种方法映射,配置文件都是写在父类Payment的映射文件里面,payment.hbm.xml如下:
view plaincopy to clipboardprint<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.lep.hibernate.model" >
<class name="Payment" >
<id name="id" column="payment_id">
<generator class="increment"/>
</id>
<!--父类中的属性-->
<property name="amount" type="string" column="amount"/>
<!--所有类共用一张表 start-->
<!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->
<!--<discriminator column="payment_type" type="string"></discriminator>-->
<!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
<!--<!–子类中的属性–>-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</subclass>-->
<!--<subclass name="CashPayment" discriminator-value="CASH">-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</subclass>-->
<!--所有类共用一张表 end-->
<!--每个子类一张表 start-->
<!--<joined-subclass name="CreditCardPayment">-->
<!--<key column="payment_id"></key>-->
<!--<property name="creditCardType" />-->
<!--</joined-subclass>-->
<!--<joined-subclass name="CashPayment">-->
<!--<key column="payment_id"></key>-->
<!--<property name="cashType" />-->
<!--</joined-subclass>-->
<!--每个子类一张表 end-->
<!--每个子类一张表,使用辨识标志 start-->
<!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->
<!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
<!--<!–fetch="select"表示在查询payment的时候,不进行外表链接查询CreditCardPayment–>-->
<!--<join table="CreditCardPayment" fetch="select">-->
<!--<key column="payment_id"></key>-->
<!--<!–子类中的属性–>-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</join>-->
<!--</subclass>-->
<!--<subclass name="CashPayment" discriminator-value="CASH">-->
<!--<join table="CashPayment">-->
<!--<key column="payment_id"></key>-->
<!--<!–子类中的属性–>-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</join>-->
<!--</subclass>-->
<!--所有类共用一张表,使用辨识标志 end-->
<!--混合使用每个子类一张表和每个分层结构一张表 start-->
<!--<discriminator column="PAYMENT_TYPE" type="string"/>-->
<!--<!–使用每个分层结构一章表–>-->
<!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</subclass>-->
<!--<!–使用每个子类一张表–>-->
<!--<subclass name="CashPayment" discriminator-value="CASH">-->
<!--<join table="CashPayment">-->
<!--<key column="payment_id"></key>-->
<!--<!–子类中的属性–>-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</join>-->
<!--</subclass>-->
<!--混合使用每个子类一张表和每个分层结构一张表 end-->
<!--每个具体类一张表 start-->
<union-subclass name="CreditCardPayment" table="CreditCardPayment">
<property name="creditCardType" column="credit_cardt_ype"></property>
</union-subclass>
<union-subclass name="CashPayment" table="CashPayment">
<property name="cashType" column="cash_type"></property>
</union-subclass>
<!--每个具体类一张表 end-->
</class>
<!--每个具体类一张表,使用隐式多态,将父类的属性映射到子类的表里 start-->
<!--<class name="CreditCardPayment" table="CreditCardPayment">-->
<!--<id name="id" column="payment_id">-->
<!--<generator class="increment"/>-->
<!--</id>-->
<!--<!–父类中的属性–>-->
<!--<property name="amount" type="string" column="amount"/>-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</class>-->
<!--<class name="CashPayment" table="CashPayment">-->
<!--<id name="id" column="payment_id">-->
<!--<generator class="increment"/>-->
<!--</id>-->
<!--<!–父类中的属性–>-->
<!--<property name="amount" type="string" column="amount"/>-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</class>-->
<!--每个具体类一张表,使用隐式多态 end-->
</hibernate-mapping>
view plaincopy to clipboardprintpublic class Payment {
protected long id;
private String amount;
// setter,getter
}
public class CashPayment extends Payment {
private String cashType;
// setter,getter
}
public class CreditCardPayment extends Payment {
private String creditCardType;
// setter,getter
}
public class Payment { protected long id; private String amount; // setter,getter}public class CashPayment extends Payment { private String cashType; // setter,getter}public class CreditCardPayment extends Payment { private String creditCardType; // setter,getter}
每个类分层结构一张表
一个父类和他的所有子类共用一张表,父类的id是主键,在数据库中就是这些类的字段都在一张表中。因为对于子类之间来说,子类CraditCardPayment没有子类CashPayment的cashType属性,所以在数据库中的那一列就是NUll,所以映射的时候所有子类的列不能设置not null约束。每个子类一张表
父类、子类都各有各自的表,子类的表里面只有子类的属性,子类的表通过主键关联到父类的表的主键,相当于子类相对于父类是单向一对一,子类增加一条记录,弗雷跟着增加一条记录。每个子类对应一张表,但是使用标识(Discriminator)
这样子就可以由父类的记录找到子类的记录。和上面的区别就是在父类的表里面添加了一个标志字段:用来标识是哪一个子类。
混合使用每个类一张表和父子类共用一张表
就是CraditCardPayment单独一张表,CashPayment和父类一张表,也要使用Discriminator。每个具体类一张表
父类、每个子类对应一张表。子类的表也保存从父类继承来的属性,所有类公用一个id,也就是各个表里面的id是连续的,表之间没有关联关系。这种方式的局限在于,如果一个属性在超类中做了映射,其字段名必须与所有子类表中定义的相同。每个具体类一张表,使用隐式多态
每个子类一张表,父类没有表,不能直接保存一个父类,也不能保存这种方法的缺陷在于,在 Hibernate 执行多态查询时(polymorphic queries)无法生成带UNION的 SQL 语句。
不论使用哪一种方法映射,配置文件都是写在父类Payment的映射文件里面,payment.hbm.xml如下:
view plaincopy to clipboardprint<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.lep.hibernate.model" >
<class name="Payment" >
<id name="id" column="payment_id">
<generator class="increment"/>
</id>
<!--父类中的属性-->
<property name="amount" type="string" column="amount"/>
<!--所有类共用一张表 start-->
<!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->
<!--<discriminator column="payment_type" type="string"></discriminator>-->
<!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
<!--<!–子类中的属性–>-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</subclass>-->
<!--<subclass name="CashPayment" discriminator-value="CASH">-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</subclass>-->
<!--所有类共用一张表 end-->
<!--每个子类一张表 start-->
<!--<joined-subclass name="CreditCardPayment">-->
<!--<key column="payment_id"></key>-->
<!--<property name="creditCardType" />-->
<!--</joined-subclass>-->
<!--<joined-subclass name="CashPayment">-->
<!--<key column="payment_id"></key>-->
<!--<property name="cashType" />-->
<!--</joined-subclass>-->
<!--每个子类一张表 end-->
<!--每个子类一张表,使用辨识标志 start-->
<!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->
<!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
<!--<!–fetch="select"表示在查询payment的时候,不进行外表链接查询CreditCardPayment–>-->
<!--<join table="CreditCardPayment" fetch="select">-->
<!--<key column="payment_id"></key>-->
<!--<!–子类中的属性–>-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</join>-->
<!--</subclass>-->
<!--<subclass name="CashPayment" discriminator-value="CASH">-->
<!--<join table="CashPayment">-->
<!--<key column="payment_id"></key>-->
<!--<!–子类中的属性–>-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</join>-->
<!--</subclass>-->
<!--所有类共用一张表,使用辨识标志 end-->
<!--混合使用每个子类一张表和每个分层结构一张表 start-->
<!--<discriminator column="PAYMENT_TYPE" type="string"/>-->
<!--<!–使用每个分层结构一章表–>-->
<!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</subclass>-->
<!--<!–使用每个子类一张表–>-->
<!--<subclass name="CashPayment" discriminator-value="CASH">-->
<!--<join table="CashPayment">-->
<!--<key column="payment_id"></key>-->
<!--<!–子类中的属性–>-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</join>-->
<!--</subclass>-->
<!--混合使用每个子类一张表和每个分层结构一张表 end-->
<!--每个具体类一张表 start-->
<union-subclass name="CreditCardPayment" table="CreditCardPayment">
<property name="creditCardType" column="credit_cardt_ype"></property>
</union-subclass>
<union-subclass name="CashPayment" table="CashPayment">
<property name="cashType" column="cash_type"></property>
</union-subclass>
<!--每个具体类一张表 end-->
</class>
<!--每个具体类一张表,使用隐式多态,将父类的属性映射到子类的表里 start-->
<!--<class name="CreditCardPayment" table="CreditCardPayment">-->
<!--<id name="id" column="payment_id">-->
<!--<generator class="increment"/>-->
<!--</id>-->
<!--<!–父类中的属性–>-->
<!--<property name="amount" type="string" column="amount"/>-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</class>-->
<!--<class name="CashPayment" table="CashPayment">-->
<!--<id name="id" column="payment_id">-->
<!--<generator class="increment"/>-->
<!--</id>-->
<!--<!–父类中的属性–>-->
<!--<property name="amount" type="string" column="amount"/>-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</class>-->
<!--每个具体类一张表,使用隐式多态 end-->
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="org.lep.hibernate.model" > <class name="Payment" > <id name="id" column="payment_id"> <generator class="increment"/> </id> <!--父类中的属性--> <property name="amount" type="string" column="amount"/> <!--所有类共用一张表 start--> <!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)--> <!--<discriminator column="payment_type" type="string"></discriminator>--> <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">--> <!--<!–子类中的属性–>--> <!--<property name="creditCardType" column="credit_cardt_ype"></property>--> <!--</subclass>--> <!--<subclass name="CashPayment" discriminator-value="CASH">--> <!--<property name="cashType" column="cash_type"></property>--> <!--</subclass>--> <!--所有类共用一张表 end--> <!--每个子类一张表 start--> <!--<joined-subclass name="CreditCardPayment">--> <!--<key column="payment_id"></key>--> <!--<property name="creditCardType" />--> <!--</joined-subclass>--> <!--<joined-subclass name="CashPayment">--> <!--<key column="payment_id"></key>--> <!--<property name="cashType" />--> <!--</joined-subclass>--> <!--每个子类一张表 end--> <!--每个子类一张表,使用辨识标志 start--> <!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)--> <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">--> <!--<!–fetch="select"表示在查询payment的时候,不进行外表链接查询CreditCardPayment–>--> <!--<join table="CreditCardPayment" fetch="select">--> <!--<key column="payment_id"></key>--> <!--<!–子类中的属性–>--> <!--<property name="creditCardType" column="credit_cardt_ype"></property>--> <!--</join>--> <!--</subclass>--> <!--<subclass name="CashPayment" discriminator-value="CASH">--> <!--<join table="CashPayment">--> <!--<key column="payment_id"></key>--> <!--<!–子类中的属性–>--> <!--<property name="cashType" column="cash_type"></property>--> <!--</join>--> <!--</subclass>--> <!--所有类共用一张表,使用辨识标志 end--> <!--混合使用每个子类一张表和每个分层结构一张表 start--> <!--<discriminator column="PAYMENT_TYPE" type="string"/>--> <!--<!–使用每个分层结构一章表–>--> <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">--> <!--<property name="creditCardType" column="credit_cardt_ype"></property>--> <!--</subclass>--> <!--<!–使用每个子类一张表–>--> <!--<subclass name="CashPayment" discriminator-value="CASH">--> <!--<join table="CashPayment">--> <!--<key column="payment_id"></key>--> <!--<!–子类中的属性–>--> <!--<property name="cashType" column="cash_type"></property>--> <!--</join>--> <!--</subclass>--> <!--混合使用每个子类一张表和每个分层结构一张表 end--> <!--每个具体类一张表 start--> <union-subclass name="CreditCardPayment" table="CreditCardPayment"> <property name="creditCardType" column="credit_cardt_ype"></property> </union-subclass> <union-subclass name="CashPayment" table="CashPayment"> <property name="cashType" column="cash_type"></property> </union-subclass> <!--每个具体类一张表 end--> </class> <!--每个具体类一张表,使用隐式多态,将父类的属性映射到子类的表里 start--> <!--<class name="CreditCardPayment" table="CreditCardPayment">--> <!--<id name="id" column="payment_id">--> <!--<generator class="increment"/>--> <!--</id>--> <!--<!–父类中的属性–>--> <!--<property name="amount" type="string" column="amount"/>--> <!--<property name="creditCardType" column="credit_cardt_ype"></property>--> <!--</class>--> <!--<class name="CashPayment" table="CashPayment">--> <!--<id name="id" column="payment_id">--> <!--<generator class="increment"/>--> <!--</id>--> <!--<!–父类中的属性–>--> <!--<property name="amount" type="string" column="amount"/>--> <!--<property name="cashType" column="cash_type"></property>--> <!--</class>--> <!--每个具体类一张表,使用隐式多态 end--></hibernate-mapping>
相关文章推荐
- 支持向量机SVM(四)
- Python Discuz 7.2 faq.php 注入漏洞全自动利用工具
- jquery uploadify在IE上传报406HttpError
- NumPy学习笔记
- sublime中输入法输入框只能在一个位置
- Otto使用记录
- 支持向量机SVM(三)
- 解析XML:DOM,SAX,PULL
- iOS开发总结之项目开发中使用UITableView几百行代码搞定级联表格
- pandas学习笔记
- c语言下的通用数据库接口(之sqlite消化,模拟c#,java的反射)
- 输入字符,输出字符时加行号
- HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
- HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
- NumPy学习笔记
- 1035 Lunch Rush (水题)
- iOS本地存储2--CoreData存储数据
- 个人网站实现扫码登录asp.net 扫码登录
- 支持向量机SVM(二)
- 不同类型数据间的转换