2011-08-17 64 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將返回空值錯誤,因爲父類不再是已加載的實體。 –