【发布时间】:2011-12-07 20:24:15
【问题描述】:
我正在运行 ColdFusion 9.01,并在撰写本文时应用了所有最新的修补程序。我在生产站点上使用 ColdFusion 9 的 Hibernate 集成已有一年多了,现在需要关联两个现有实体;但是,Hibernate 会为多对多关系生成错误的列名。
我现有的两个实体是 Presenter 和 Product。我将 dbcreate 设置为“none”,并在 Oracle 11g 数据库上使用 autogenmap 的默认值。因此,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';
这是由 Hibernate 生成的无效 SQL。
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 =?
在诊断此问题时,我保存了 Hibernate 生成的 HBXML 文件。我在下面包含了我的 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 **** 我已授予解决方案;但是,仍然有问题。我附上了显示剩余问题的 DUMP 屏幕截图。 ColdFusion 说“[未定义的数组元素] 无法检索集合大小:[Product.Presenters#0]”。
【问题讨论】:
-
我认为这与您的 lazy="extra" 有关,因为它只是带回带有代理对象链接的 id。这可能无法正确转储。试试lazy="true" 看看会发生什么。不太确定,但最好的猜测。
标签: hibernate orm coldfusion