CF-ORM (Hibernate) を使用した ColdFusion 9 で観察した、注意すべき点は何ですか?
4 に答える
エンティティ
init()
メソッドに必須の引数を含めることはできません。そうしないEntityNew()
と、他のCF-ORMアクションが機能しなくなります。Factoryを使用してエンティティを作成し、そこで必要な引数を適用することをお勧めします。ORMReload()
withormsettings.dbcreate = "drop create"
は、すべてのテーブルを削除しない場合があります。 CF9累積ホットフィックス1はこれを少し改善しますが、DB内のテーブルを自分で削除することをお勧めします。type="date"
(デフォルトで使用ormtype="date"
)、日付のみを保存し、時刻は保存しません。時間を持続させたい場合は、ormtype="timestamp"
type="string"
デフォルトでvarchar(255)
type="numeric"
デフォルトではfloat
、ではありませんint
。必要に応じてormtype="int"を使用します。fieldtype="id"
ジェネレーターがジェネレーターに設定されている場合、ormtypeはデフォルトで。になりますint
。type="string" length="10"
を使用しますがvarchar(10)
、char(10)
ormtype="char" length="10"
まだ使用しchar(1)
ます。sqltype="char(10)"
本当に必要な場合に使用します。type="boolean"
tinyint
デフォルトで使用します。sqltype="bit"
必要に応じて使用します。inverse=true
通常は「1対多」側で、双方向の関係で使用する必要があります。一方向の関係では使用しないでください!
inverse="true"
関係はまったく持続しないかもしれません!MS-SQLを使用する場合、Nullはインデックス内の一意の値と見なされるため、1対1のプロパティがNullに設定されたエンティティを複数持つことはできません。列をnullにしないことをお勧めします。(またはリンクテーブルを使用)
EntityLoad("entity", 1, true)
動作しますが、EntityLoadByPK("entity", 1)
よりクリーンです!EntityLoad()
、、EntityLoadByPK()
およびORMExecuteQuery
withは、エンティティが見つからない場合unique=true
に返されます。戻り値を使用する前に確認するために使用しますnull
。isNull()
ORMExecuteQuery
デフォルトでエンティティが見つからない場合は、空の配列を返します。singularname
「1対多」/「多対多」でプロパティを使用して、生成された関数の見栄えを良くすることを忘れないでください(例:addDog(Dog dog)
vsaddDogs(Dog dogs)
。)<cfdump>
すべてのlazy-loadプロパティをロードします。<cfdump var="#entityToQuery([entity])#">
または、top = 1に設定するか、効率的にダンプすることもできます。セッションスコープに格納されているエンティティは、Hibernateセッションスコープで切断され、遅延読み込みプロパティは読み込まれません。Hibernateセッションスコープを復元するには、
entityLoadByExample()
またはを使用しますentitySave(entity)
。cascade="all-delete-orphan"
通常、「1対多」または「多対多」の関係の方が理にかなっています。Hibernateはnullを設定してから削除するため、列がnull可能であることを確認してください。それがあなたの望みの行動であるかどうかをテストして確認してください。required="true"
いつでも設定notnull="true"
でき、CFCExplorerでCFCを閲覧している他の人にとって読みやすくなりますEntityNew('Y')
new com.X.Y
一部のAdobeエンジニアによると、エンティティが後で永続化される場合よりもわずかに効率的です。継承されたエンティティとの関係は、未修正のHibernateバグが原因で壊れることがあります。回避策として使用
linktable
してください。structKeyColumn
ターゲットエンティティのPKにすることはできません。双方向の多対多は構造体を使用できません
構造体に新しいエンティティを追加する
structKeyColumn
場合、CFが親エンティティを永続化するときに無視されます。1対多/多対多の配列または構造体に直接アクセスする場合は、使用する前に、対応する配列/構造体が存在することを確認してください。生成されたaddX()/ hasX()/ removeX()は、いつでも安全に使用できます。
で
postInsert()
、エンティティの休止状態セッションは使用できなくなったため、postInsert()でのプロパティの設定は黙って無視されるか、SessionisClosed例外がスローされます。エンティティが
entityLoad()
DBによってまたはHQLからロードされた後、EntitySave()
呼び出されなくても変更は自動的に保持されます。CF-ORMとのトランザクションは、新しいセッションを開始し、終了すると閉じるように実装されています。
イベント内(つまり、preLoad()/ postInsert())で、変数に割り当てると、型に関するJava例外がスローされる場合があります。JavaCast()を使用してバグを回避します。
アップデート
- CF9.0.1 +:を使用する
<cfquery dbtype="hql">
と、実行が簡単になりcfqueryparam
、デバッグ出力に実際にバインドされた値が表示されます。
その他の推奨事項:
- ormsettings.flushAtRequestEnd = false をオフにして、リクエストの最後に自動フラッシュを行わないようにします。代わりに、すべての書き込みトランザクション (entitySave() または永続化されたエンティティを編集するとき) でトランザクションを使用します (CF9.01 以降、cftransaction はトランザクション完了のためにセッションをフラッシュします)。
- HQL でバインドされたパラメーターを使用して SQL インジェクションを防止する - 名前のない '?' または名前付き「:」表記を使用して、問題のフィールドに対する ORM による型バインディングを保証します (CFQUERYPARAM のように)。SQLインジェクションを防ごう!
- CF9.0.1 では、CFQUERY dbtype="hql" で HQL をインラインで書き込みおよび出力できます。CFQUERYPARAM を使用して、パラメーターをインラインでバインドします (HQL の名前のない ? 表記と同等)。
- HQL で LEFT OUTER JOIN FETCH を使用して、リレーションシップを熱心にフェッチします。
- 双方向の関係を持つ CFC の追加/削除関数をオーバーライドして、どちらかが設定されている場合に両方が設定されるようにします。
- ormsettings.logsql=true にすると、派生 SQL がコンソールに表示されます。log4j Hibernate 設定を調整して、Hibernate からのログ設定をさらに微調整します。
- Google グループ cf-orm-dev に参加してください。そこには明るい人々が。
Hibernate ロギングをいじることと併せて、データソースの「接続の維持」をオフにすることもできます。
SQL Server 2005 では、プロファイラーを起動して、通過するクエリを監視できます。
接続の維持がオフになっているため、Hibernate は毎回新しい準備済みステートメントを作成する必要があります。
準備されたステートメントを読むのは難しいかもしれませんが、少なくとも、生成されている生のクエリを見ることができます。
接続を維持すると、これらの準備済みステートメントが一度作成され、次のようなものが表示されます
sp_execute 15、「someparam」
これが実行される前に、sp_prepexec が実行されました。これが 15 の由来です。
EntityReload は、CFDUMP のような遅延読み込みを無視しているようです。
EntitySave の後に使用して、データベース内のデフォルトの列を取得します。SQL プロファイラー (SQL Server のトレース ツール) で、大量のクエリが実行されていることがわかります。
EntityLoadByPK などに変更すると、オブジェクトが読み込まれ、余分な関係クエリがすべて表示されなくなり、大きな問題が発生する可能性があります。