where
多対多のプロパティの動作は非常に奇妙です...
これをデバッグするには、Hibernate のログ記録を有効にします。この投稿を参照してください: http://www.rupeshk.org/blog/index.php/2009/07/coldfusion-orm-how-to-log-sql/
次の例を見てください。
記事.cfc
/**
* @output false
* @persistent true
* @table article
*/
component {
property name="id" fieldtype="id";
property name="title";
property
name="tags" singularname="tag"
fieldtype="many-to-many" cfc="Tag" linktable="link_article_tag" fkcolumn="articleId"
inversejoincolumn="tagId" where=" deleted = 0 "
;
}
タグ.cfc
/**
* @output false
* @persistent true
* @table tag
*/
component {
property name="id" fieldtype="id";
property name="name";
property name="deleted" dbdefault="0";
property
name="articles" singularname="article"
fieldtype="many-to-many" cfc="Article" linktable="link_article_tag" fkcolumn="tagId"
inversejoincolumn="articleId"
;
}
このようなすべての記事をリストしようとするとormExecuteQuery('from Article')
、休止状態のログに何が追加されているかを確認してください。
select
tags0_.articleId as articleId6_1_,
tags0_.tagId as tagId1_,
tag1_.id as id0_0_,
tag1_.name as name0_0_,
tag1_.deleted as deleted0_0_
from
link_article_tag tags0_
inner join
tag tag1_
on tags0_.tagId=tag1_.id
where
tags0_.deleted = 0
くそっ!なんてこった:| tags0_ == テーブルに参加 ... 何が問題なのかわかりますか?
この動作を理解するために、次のファイルを使用して Application.cfc で HBMXML 生成を有効にthis.ormSettings.saveMapping = true
します。
<!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="Tag" lazy="true"
name="cfc:www.app.models.test.Tag" table="tag">
<id name="id" type="string">
<column length="255" name="id"/>
</id>
<property name="name" type="string">
<column name="name"/>
</property>
<property name="deleted" type="string">
<column default="0" name="deleted"/>
</property>
<bag name="articles" table="link_article_tag">
<key column="tagId"/>
<many-to-many class="cfc:www.app.models.test.Article" column="articleId"/>
</bag>
</class>
</hibernate-mapping>
わかること:where
属性はbag
to ではなく、レベルで設定されていますmany-to-many
。このように編集すると:
<bag name="tags" table="link_article_tag">
<key column="articleId"/>
<many-to-many class="cfc:www.app.models.test.Tag" column="tagId" where=" deleted = 0 "/>
</bag>
生成された SQL は次のようになります。
select
tags0_.articleId as articleId62_1_,
tags0_.tagId as tagId1_,
tag1_.id as id59_0_,
tag1_.name as name59_0_,
tag1_.deleted as deleted59_0_
from
link_article_tag tags0_
inner join
tag tag1_
on tags0_.tagId=tag1_.id
where
tag1_.deleted = 0
この方法は機能しますが、コードのメンテナンスと可読性には適していません。誰かがより良い解決策を持っているなら、私は興味があります。