hibernate继承的三种映射策略( Inheritance mapping)

继承的三种映射策略


每个类级别一个表(父类和子类公用一张表)

		<class name="Payment" table="PAYMENT">
	    <id name="id" type="long" column="PAYMENT_ID">
	        <generator class="native"/>
	    </id>
	    <discriminator column="PAYMENT_TYPE" type="string"/>
	    <property name="amount" column="AMOUNT"/>
	    ...
	    <subclass name="CreditCardPayment" discriminator-value="CREDIT">
	        <property name="creditCardType" column="CCTYPE"/>
	        ...
	    </subclass>
	    <subclass name="CashPayment" discriminator-value="CASH">
	        ...
	    </subclass>
	    <subclass name="ChequePayment" discriminator-value="CHEQUE">
	        ...
	    </subclass>
		</class>


   discriminator 指定识别者列
   discriminator-value 识别者列的值
   约束:子类属性不能运用非空约束

  支持各种多态映射策略


父类和每个子类一张表

		<class name="Payment" table="PAYMENT">
		    <id name="id" type="long" column="PAYMENT_ID">
		        <generator class="native"/>
		    </id>
		    <property name="amount" column="AMOUNT"/>
		    ...
		    <joined-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">
		        <key column="PAYMENT_ID"/>
		        <property name="creditCardType" column="CCTYPE"/>
		        ...
		    </joined-subclass>
		    <joined-subclass name="CashPayment" table="CASH_PAYMENT">
		        <key column="PAYMENT_ID"/>
		        ...
		    </joined-subclass>
		    <joined-subclass name="ChequePayment" table="CHEQUE_PAYMENT">
		        <key column="PAYMENT_ID"/>
		        ...
		    </joined-subclass>
		</class>



子类表例如CHEQUE_PAYMENT中<key column="PAYMENT_ID"/>指定了PAYMENT_ID当前列关联父表,
并且当前列为为主键主键列


		<class name="Payment" table="PAYMENT">
		    <id name="id" type="long" column="PAYMENT_ID">
		        <generator class="native"/>
		    </id>
		    <discriminator column="PAYMENT_TYPE" type="string"/>
		    <property name="amount" column="AMOUNT"/>
		    ...
		    <subclass name="CreditCardPayment" discriminator-value="CREDIT">
		        <join table="CREDIT_PAYMENT">
		            <key column="PAYMENT_ID"/>
		            <property name="creditCardType" column="CCTYPE"/>
		            ...
		        </join>
		    </subclass>
		    <subclass name="CashPayment" discriminator-value="CASH">
		        <join table="CASH_PAYMENT">
		            <key column="PAYMENT_ID"/>
		            ...
		        </join>
		    </subclass>
		    <subclass name="ChequePayment" discriminator-value="CHEQUE">
		        <join table="CHEQUE_PAYMENT" fetch="select">
		            <key column="PAYMENT_ID"/>
		            ...
		        </join>
		    </subclass>
		</class>



join和subclass的联合用法,这种用法可以和上面的joined-subclass联合一起使用,
子类一张表
		<class name="Payment">
		    <id name="id" type="long" column="PAYMENT_ID">
		        <generator class="sequence"/>
		    </id>
		    <property name="amount" column="AMOUNT"/>
		    ...
		    <union-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">
		        <property name="creditCardType" column="CCTYPE"/>
		        ...
		    </union-subclass>
		    <union-subclass name="CashPayment" table="CASH_PAYMENT">
		        ...
		    </union-subclass>
		    <union-subclass name="ChequePayment" table="CHEQUE_PAYMENT">
		        ...
		    </union-subclass>
		</class>



原文有 The identity generator strategy is not allowed in union subclass inheritance.
The primary key seed has to be shared across all unioned subclasses of a hierarchy
意思是子类共享父类生成的id,子类自己不能够定义id生成器

隐式多态关联


			<class name="CreditCardPayment" table="CREDIT_PAYMENT">
			    <id name="id" type="long" column="CREDIT_PAYMENT_ID">
			        <generator class="native"/>
			    </id>
			    <property name="amount" column="CREDIT_AMOUNT"/>
			    ...
			</class>
			
			<class name="CashPayment" table="CASH_PAYMENT">
			    <id name="id" type="long" column="CASH_PAYMENT_ID">
			        <generator class="native"/>
			    </id>
			    <property name="amount" column="CASH_AMOUNT"/>
			    ...
			</class>
			
			<class name="ChequePayment" table="CHEQUE_PAYMENT">
			    <id name="id" type="long" column="CHEQUE_PAYMENT_ID">
			        <generator class="native"/>
			    </id>
			    <property name="amount" column="CHEQUE_AMOUNT"/>
			    ...
			</class>



使用隐式多态的策略,子类中声明父类的字段amount,
这种策略不支持many-to-one的映射策略

使用any标签建立多态映射策略


继承映射策略和多态支持


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值