【问题标题】:ColdFusion ORM relationship mapping 'one-to-many' issue when mapped to subclass映射到子类时,ColdFusion ORM 关系映射“一对多”问题
【发布时间】:2011-08-17 03:10:25
【问题描述】:

这是可重复的,可能是一个错误。对于这个例子,我有三个表:

付款
付款ID
日期
支付类型

信用
付款ID
卡号
卡片类型ID

卡片类型
身份证
说明

Payment 和 Credit 分别是父类表和子类表。代码如下:

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 应用于 select 和 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=?  

这会在调用简单的 entityload("cardType") 时导致很多“CardType 不存在”错误。

任何人都知道为什么它不能正确地将其应用于子类,这可能是我缺少的配置设置。

提前致谢。

【问题讨论】:

    标签: orm coldfusion


    【解决方案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>
    

    【讨论】:

      【解决方案2】:

      尝试将 mapedSuperClass="true" 添加到支付 CFC。不确定这是否会像我使用 mappedSuperClass 用于非持久性“基础”对象一样正常工作。

      【讨论】:

      • 你能创建一个非持久的“基”类并让支付和信用对象扩展它吗?
      • 如果我想继续将它用作带有鉴别器列的继承对象,则不是。如果我关闭持久性,CF 会返回空值错误,因为父类不再是加载的实体。
      猜你喜欢
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      相关资源
      最近更新 更多