ColdFusion ORM отображает проблему «один ко многим» при сопоставлении с подклассом - PullRequest
0 голосов
/ 17 августа 2011

Это повторяется и может быть ошибкой. Для этого примера у меня есть три таблицы:

Оплата
PaymentID
дата
paymentType

Credit
PaymentID
cardNo
cardTypeID

CardType
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 к предложениям 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=?  

Это приводит к большому количеству ошибок "CardType не существует" при вызове простой загрузки объекта ("cardType").

У любого есть идея, почему он не применил бы его правильно к дочернему классу, и возможно ли это параметр конфигурации, который мне не хватает.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Итак, если я сопоставлю файл 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 голосов
/ 17 августа 2011

Попробуйте добавить mapedSuperClass = "true" в CFC для оплаты.Не уверен, что это будет работать, как обычно, я использовал mappedSuperClass для непостоянных «базовых» объектов.

...