Почему ColdFusion / Hibernate добавляет имя сущности в качестве префикса к именам столбцов в сгенерированном SQL? - PullRequest
2 голосов
/ 14 октября 2011

Я использую ColdFusion 9.01 со всеми последними исправлениями, примененными на момент написания этой статьи.Я уже более года использую интеграцию Hibernate в ColdFusion 9 на производственной площадке, и теперь мне нужно связать две существующие сущности;однако Hibernate генерирует неправильные имена столбцов для отношения «многие ко многим».

Мои две существующие сущности - это Presenter и Product.Я установил dbcreate на «none» и использую значения по умолчанию для autogenmap в базе данных Oracle 11g.Таким образом, Hibernate не несет ответственности за изменения схемы в моей базе данных.

Вот новое свойство, которое я добавил в свою сущность Presenter.

/** Relation to any episodes associated to this presenter. **/
property name='Products' fieldtype='many-to-many' lazy='extra'
    singularName="Product" cfc='platform.shared.models.entities.Product' fkcolumn='PRESENTER_ID'
    linktable='PRESENTERS_TO_PRODUCTS' cacheuse = 'read-only' cachename = 'EntityCache' inversejoincolumn='PRODUCT_ID';

Вот неверный SQL сгенерировано Hibernate.

select count(Product_product_id) from PRESENTERS_TO_PRODUCTS where Presenter_presenter_id =?

Я не уверен, почему Hibernate префикс столбцов с именем объекта.SQL должен выглядеть следующим образом:

select count(product_id) from PRESENTERS_TO_PRODUCTS where presenter_id =?

Когда я это диагностировал, я сохранил файлы HBXML, сгенерированные Hibernate.Я включил полный файл для моей сущности Presenter ниже.

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class entity-name="Presenter" lazy="true"
        name="cfc:platform.shared.models.entities.Presenter" table="PRESENTERS">
        <id name="presenter_id" type="integer">
            <column name="presenter_id"/>
            <generator class="increment"/>
        </id>
        <property name="presenter_bio" type="text">
            <column name="presenter_bio"/>
        </property>
        <property name="presenter_name" type="text">
            <column name="presenter_name"/>
        </property>
        <property name="presenter_website" type="text">
            <column name="presenter_website"/>
        </property>
        <property name="presenter_company" type="text">
            <column name="presenter_company"/>
        </property>
        <property name="presenter_internalname" type="text">
            <column name="presenter_internalname"/>
        </property>
        <property name="presenter_logo" type="integer">
            <column name="presenter_logo"/>
        </property>
        <property name="presenter_description" type="text">
            <column name="presenter_description"/>
        </property>
        <property name="deleted" type="integer">
            <column name="deleted"/>
        </property>
        <property name="presenter_is_evangelist" type="integer">
            <column name="presenter_is_evangelist"/>
        </property>
        <property name="presenter_is_expert" type="integer">
            <column name="presenter_is_expert"/>
        </property>
        <property name="presenter_about" type="text">
            <column name="presenter_about"/>
        </property>
        <bag lazy="extra" name="Episodes" table="ASSET_TO_PRESENTERS">
            <cache region="EntityCache" usage="read-only"/>
            <key column="PRESENTER_ID"/>
            <many-to-many
                class="cfc:platform.shared.models.entities.Episode" column="ASSET_ID"/>
        </bag>
        <!-- This is the new relationship causing trouble -->
    <bag lazy="extra" name="Products" table="PRESENTERS_TO_PRODUCTS">
        <cache region="ATVEntityCache" usage="read-only"/>
        <key column="PRESENTER_ID"/>
        <many-to-many
            class="cfc:platform.shared.models.entities.Product"
            column="PRODUCT_ID" not-found="ignore"/>
    </bag>
        <!-- End new relationship -->
        <many-to-one
            class="cfc:platform.shared.models.entities.AttachmentImage"
            column="presenter_photo" lazy="proxy" name="Photo"/>
    </class>
</hibernate-mapping>

Очень признателен.

**** ОБНОВЛЕНИЕ 1 **** Я добавил столбец inversejoincolumn.Я могу получить доступ к продуктам в моем модульном тесте с помощью следующих утверждений, однако, когда я сбрасываю сущность, появляется ошибка:

var p = entityLoadByPK('Presenter',276);
var pr = p.getProducts();
// Works
assertEquals(2,arrayLen(pr),'Expected 2 products');
// Also works
assertEquals('ProductA',pr[1].getproduct_name(),'Incorrect product name.');
// Also works       
assertEquals('ProductB',pr[2].getproduct_name(),'Incorrect product name.');
// Fails
writeDump(var=p,top=2,abort=true);

**** ОБНОВЛЕНИЕ 2 **** I 'мы наградили решение;однако что-то все еще выключено.Я приложил скриншот DUMP, показывая оставшуюся проблему.ColdFusion говорит, что «[неопределенный элемент массива] не смог получить размер коллекции: [Product.Presenters # 0]».enter image description here

1 Ответ

1 голос
/ 14 октября 2011

Всякий раз, когда я использую отношение многие ко многим, у меня всегда есть атрибут inversejoincolumn.Я думаю, что это просто угадывание, потому что это не определено явно.Вот как всегда выглядят мои отношения:

property name="names" singularname="name" fieldtype="many-to-many"
cfc="cfc" linktable="linktable" fkcolumn="ThisId" 
inversejoincolumn="otherId";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...