2012-04-10 11 views
0

私はコールドボックス3.5およびColdFusion 10 ORMを使用してブログアプリケーションに取り組んでいる、と私はランダムに次のエラーメッセージになっている:ORM - リンクテーブルのエラー

エラータイプを:アプリケーション:[N/A]

エラーメッセージ:Hibernateの操作中の例外。 更新/削除された行が存在しないか、セッションに古いデータが含まれています。

根本原因:org.hibernate.StaleObjectStateException:行は(間違っていたか、保存されていないと値のマッピング)を更新または別のトランザクションによって削除されました:[297e1bfa369cf17501369d26ffae00a4エントリ#]

/モデル/エントリー/エントリー。 CFC

component 
    persistent="true" 
    table="Entry" 
    output="false" 
{ 
    // primary key 
    property name="entryID" fieldtype="id" ormtype="string" type="string" length="32" generator="uuid"; 

    // properties 
    property name="title" fieldtype="column" ormtype="string" type="string" length="100" notnull="true"; 
    property name="alias" fieldtype="column" ormtype="string" type="string" length="100" notnull="true"; 
    property name="body" fieldtype="column" ormtype="string" type="string" sqltype="nvarchar(max)" notnull="true"; 
    property name="allowComments" fieldtype="column" ormtype="boolean" type="boolean" sqltype="bit" dbdefault="1" default="true" notnull="true"; 
    property name="released" fieldtype="column" ormtype="boolean" type="boolean" sqltype="bit" dbdefault="1" default="true" notnull="true"; 
    property name="releasedDate" fieldtype="column" ormtype="timestamp" type="date"; 
    property name="addDate" fieldtype="timestamp" ormtype="timestamp" type="date"; 

    // relations 
    property name="categories" fieldtype="many-to-many" cfc="model.category.Category" linktable="EntryCategory" fkcolumn="entryID" inversejoincolumn="categoryID" singularname="category" cascade="all" lazy="true"; 
    property name="comments" fieldtype="one-to-many" cfc="model.entryComment.EntryComment" fkcolumn="entryID" singularname="comment" cascade="all-delete-orphan"; 
    property name="user" fieldtype="many-to-one" cfc="model.user.User" fkcolumn="userID" notnull="true" cascade="save-update"; 
    property name="views" fieldtype="one-to-many" cfc="model.entryView.EntryView" fkcolumn="entryID" singularname="view" cascade="all-delete-orphan"; 

    // validation 
    this.constraints = { 
     "title" = {"required" = true}, 
     "body" = {"required" = true}, 
     "allowComments" = {"required" = true, type="boolean"}, 
     "released" = {"required" = true, type="boolean"}, 
     "categories" = {size=1}, 
     "user" = {type="component"} 
    }; 
} 

/model/category/Category.cfc

ここで

は、私が実行しているコードです:「5回のうちの1作品」と「毎回作品」としてのセクションでは、ラベル

<cfscript> 
    entry = entityNew("Entry", { 
     "title" = "test", 
     "body" = "test", 
     "alias" = "test", 
     "allowComments" = 0, 
     "released" = 0, 
     "user" = entityLoadByPK("User", "297e1bfa3697d377013697f53ca10084") 
    }); 

    // works 1 out of 5 times 
    entry.setCategories([entityLoadByPK("Category", "297e1bfa36986e69013698c3e54f000d")]); 

    // works every time 
    //entry.setCategories(entityLoad("Category", "297e1bfa36986e69013698c3e54f000d")); 
    //entry.setCategories(entityLoad("Category")); 

    entitySave(entry); 
    ormFlush(); 
</cfscript> 

注意してください。私が間違っていることを私は得られない。私は他のオブジェクトがリンクされたテーブルを使用するこれらに似ていると私は同様のエラーメッセージが表示されます。私はSQLログを見直しました。このエラーは、EntryCategoryテーブルに挿入する準備ができたら表示されます。何か案は?

+0

'entry.addCategory(entityLoadByPK( "カテゴリー"、 "297e1bfa36986e69013698c3e54f000dは"))'より良い仕事しませんか? – Henry

+0

正確ではありません。私が使用しているメンテナンスページは、ユーザーが複数のカテゴリを選択できるように設定されています。ですから、私がしたいことは、ID値をエンティティの配列に変換してからentry.setCategories(my_category_array) –

+0

を実行することです。そうであれば、HQLを使用して、どこのIDを(?)で使用しますか?それはとてもうまくいく。エンティティにすでに配列がある場合は、まずArrayClear()を使用します。 – Henry

答えて

0

HQLを使用して、どこのIDに(?)を使用しますか?それはとてもうまくいく。エンティティが既に配列されている場合

、最初の()ArrayClearを使用します。

UPDATE:

categories = ormExecuteQuery("from Category where Id IN (:Ids)", 
          {Ids=listToArray(FORM.categoryIDs)}); 
entry.setCategories(categories); 
+2

少し(擬似)コードをそこに投げてください。 "Use HQL"はORMの使い方を学ぶだけの人にはあまり役に立ちません。 – ale