1

私はこれをまったく正しく行っていない可能性があります。

現在ログインしているユーザーの詳細を含むオブジェクトを初期化してセッションスコープに保存しています。

CFC はプロバイダーと呼ばれ、ユーザーが正常にログインすると、次のように呼び出します。

session.Provider = New model.Provider().init(loginResult.ProviderID);

指定した値を空の文字列に設定する resetValues という CFC のメソッドがありますが、値をリセットするとエンティティを保存する方法がわかりません。

ここに完全な CFC があります。で保存しようとしていますがentitySave( this );、機能しません。この変更を保存 (永続化) する方法について何か提案はありますか? それとも、これらの値を変更する方法を完全に再考する必要がありますか?

よろしくお願いします。

component persistent="true" table="provider" {
property name="id" fieldtype="id" column="provider_id";
property name="title" ormtype="text";
property name="status" ormtype="integer";
property name="email" ormtype="text";

property name="ext_src" ormtype="text";
property name="ext_src_login1" ormtype="text";
property name="ext_src_login2" ormtype="text";
property name="ext_src_login3" ormtype="text";
property name="ext_src_login4" ormtype="text";

//property name="rooms" fieldtype="one-to-many" cfc="Room" fkcolumn="provider_id";

//init()
public function init(providerID="0"){
    variables.providerID = arguments.providerID;
    return this;
}

//get()
public function get(){
    return entityLoadByPK("Provider",variables.providerID);
}

//resetValues()
public function resetValues(){
    this.setExt_src_login1('');
    this.setExt_src_login2('');
    this.setExt_src_login3('');
    this.setExt_src_login4('');
    entitySave(this);
}

}

次のエラーが表示されます。a different object with the same identifier value was already associated with the session

4

1 に答える 1

3

私がこれで間違っていると思ういくつかのこと

  1. ORMエンティティをリクエスト間で存続するスコープに格納することはお勧めできません。デタッチされたエンティティで問題が発生します(CF-ORMを使用したColdFusion 9の注意事項を参照)。ORMエンティティは、リクエストにまたがらない休止状態のセッション(cfセッションと混同しないでください)に接続されます。リクエストが終了すると、セッションに割り当てたエンティティは切り離されます。プロバイダーIDをセッションに保存し、各リクエストでエンティティをプルします。オーバーヘッドが大きすぎると思われる場合は、IDや名前など、基本的なリクエストに必要なものを保存し、エンティティを実際に実行するときにのみエンティティをロードします。

  2. タイプが「id」のフィールドは変更しないでください(provider = "assigned"を使用している場合を除く)。

Hibernateセッション内には、特定の識別子を持つエンティティのインスタンスが1つだけ存在できるため、エンティティのIDを設定してから、同じIDでentityLoadByPK()を実行しようとすると、Hibernateが混乱します。

特定のエンティティをIDで取得するget()メソッドが必要な場合は、これをサービスまたはファクトリに配置するのが最適です。エンティティを取得または検索するための汎用メソッドを使用して抽象サービスを簡単に作成し、特定のニーズに合わせてメソッドを拡張できます。Coldspring 2には、優れた出発点であるAbstractGatewayが含まれています-http ://sourceforge.net/apps/trac/coldspring/wiki/ORMAbstractGateway

TLDR; 修正することです

session.provider = entityLoadByPK("Provider", loginResult.ProviderID);
于 2012-04-30T16:55:05.897 に答える