2011-08-17 121 views
0

这是可重复的,可能是一个错误。在这个例子中我有三个表:当映射到子类时,ColdFusion ORM关系映射'一对多'问题​​

付款
paymentID
日期
paymentType

信用
paymentID
cardNo
cardTypeID

CardTyp È
ID
说明

付款和信用分别父和子类表。代码如下:

payment.cfc

component persistent="true" table="payment" discriminatorcolumn="paymentType"{ 
    property name="paymentID"; 
    property name="date"; 
} 

credit.cfc

component persistent="true" extends="payment" joincolumn="paymentID" 
    table="credit" discriminatorvalue="ccard"{ 
    property name="cardNo"; 
    property name="cardTypes" fieldtype="many-to-one" lazy="true" cfc="cardType" 
     fkcolumn="cardTypeID"; 
} 

cardType.cfc

component persistent="true" table="cardType"{ 
    property name="id"; 
    property name="description"; 
    property name="creditCards" fieldtype="one-to-many" lazy="extra" 
     type="struct" structkeycolumn="id" cfc="credit" fkcolumn="cardType"; 
} 

错误与cardType.cfc中的“一对多”关系有关。当ORM生成SQL,它试图将fkcolumn适用于选择和WHERE子句父类:

select 
    creditcard0_.cardType as cardType30569_1_, 
    creditcard0_.PaymentID as PaymentID1_, 
    creditcard0_.PaymentID as PaymentID30570_0_, 
    creditcard0_.Date as Date30570_0_, 
    creditcard0_1_.cardNo as cardNo30572_0_, 
    creditcard0_1_.cardType as cardType30572_0_ 
from 
    Payment creditcard0_ 
inner join 
    CreditCardPayment creditcard0_1_ 
     on creditcard0_.PaymentID=creditcard0_1_.PaymentID 
where 
    creditcard0_.cardType=? 

这导致了大量的“CardType不存在”的错误时,一个简单的entityload(“cardType” ) 叫做。

任何人都有任何想法,为什么它不会正确地应用于子类,它可能是我缺少的配置设置。

在此先感谢。

回答

1

所以,如果我的hbmxml文件映射像这样,显然它修复该问题:

<map lazy="extra" name="creditCards" table="CreditCardPayment" inverse="true"> 
    <key column="cardType"/> 
    <map-key column="CardNo" type="string"/> 
    <many-to-many unique="true" column="PaymentID" class="cfc:entities.credit"/> 
</map> 
0

尝试向付款CFC添加mapedSuperClass =“true”。不知道这是否会像我一直使用mappedSuperClass作为非持久“基础”对象一样工作。

+0

不幸的是这不会持久化类的工作。 –

+0

你可以制作一个非持续性的“基础”课程,并有支付和学分对象吗? –

+0

不是,如果我想继续使用它作为具有鉴别器列的欲望的继承对象。如果关闭持久性,CF将返回空值错误,因为父类不再是已加载的实体。 –