Hibernate继承映射三种策略学习

来源:互联网 发布:python 打包 ex_freeze 编辑:程序博客网 时间:2024/04/20 03:03


假设实体关系如下:


继承映射三种策略:


每个类分层结构 一张表  Table per class hierarchy
<!-- 每个类分层结构 一张表  Table per class hierarchy -->
<!-- 只有一张表 -->

<!-- 每个类分层结构 一张表  Table per class hierarchy --><!-- 只有一张表 --><class name="Payment"><id name="id"><generator class="native" /></id><discriminator column="PAYMENT_TYPE" type="string" /><property name="typeName" /><property name="amount" /><subclass name="Credit" discriminator-value="CREDIT"><property name="number" /><property name="type" /><property name="expDate" /></subclass><subclass name="Cash" discriminator-value="CASH"><property name="cashTenderd" /></subclass><subclass name="Check" discriminator-value="CHECK"><property name="name" /><property name="bankId" /></subclass></class>
这种继承映射策略,整个继承结构一张表,则此策略共建一张表,要求字段不能有非空约束,而且要添加多一个字段表示类型(如这里的PAYMENT_TYPE)
注:但此PAYMENT_TYPE字段并未在类属性中,只存在映射文件和数据库表中




每个子类一张表 Table per subclass
<!-- 每个子类一张表  Table per subclass --><!-- 共三张表 --><class name="Payment"><id name="id"><generator class="native" /></id><property name="typeName" /><property name="amount" /><joined-subclass name="Credit"><key column="id"></key><property name="number" /><property name="type" /><property name="expDate" /></joined-subclass><joined-subclass name="Cash"><key column="id"></key><property name="cashTenderd" /></joined-subclass><joined-subclass name="Check" table="Check_"><key column="id"></key><property name="name" /><property name="bankId" /></joined-subclass></class>

这种继承映射策略,每个类一张表,抽象类也有表,则共建三张表,要求子表有个字段id,因为此策略要求子表和父表是一对一的关系
注:子表的id字段并未在类属性中,只存在映射文件和数据库表中





每个具体类一个张表 Table per concrete class
<!-- 每个具体类一张表  Table per concrete class --><!-- 共两张表 --><class name="Payment"><id name="id"><generator class="hilo"><param name="table">hi_value</param><param name="column">next_value</param><param name="max_lo">100</param></generator></id><property name="typeName" /><property name="amount" /><union-subclass name="Credit"><property name="number" /><property name="type" /><property name="expDate" /></union-subclass><union-subclass name="Cash"><property name="cashTenderd" /></union-subclass><union-subclass name="Check" table="Check_"><property name="name" /><property name="bankId" /></union-subclass></class>

这种继承映射策略,每个具体类一张表,则此策略共建两张表,这种策略不支持identity生成策略,要求整个继承结构即所有表所有记录的id不能重复