2012-04-10 7 views
0

Ich bin auf einem Blog-Anwendung arbeitet mit ColdBox 3.5 und Coldfusion 10 ORM, und ich bin zufällig folgende Fehlermeldung erhalten:ORM - Verknüpfte Tabelle Fehler

Typ Fehler: Anwendung: [N/A]

Fehlermeldungen: Ausnahme im Hibernate-Betrieb. Entweder ist die aktualisierte/gelöschte Zeile nicht vorhanden oder die Sitzung enthielt veraltete Daten.

Ursachen: org.hibernate.StaleObjectStateException: Reihe wurde durch eine andere Transaktion aktualisiert oder gelöscht (oder nicht gespeicherten Wertzuordnung nicht korrekt war): [Eintrag # 297e1bfa369cf17501369d26ffae00a4]

/Modell/entry/Eintrag. 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:

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

    // properties 
    property name="name" fieldtype="column" ormtype="string" type="string" length="50" notnull="true"; 
    property name="alias" fieldtype="column" ormtype="string" type="string" length="50" notnull="true"; 
    property name="description" fieldtype="column" ormtype="string" type="string" default="" length="200"; 
    property name="addDate" fieldtype="timestamp" ormtype="timestamp" type="date"; 
    property name="active" fieldtype="column" ormtype="boolean" type="boolean" sqltype="bit" dbdefault="1" default="true" notnull="true"; 

    // relations 
    property name="entries" fieldtype="many-to-many" cfc="model.entry.Entry" linktable="EntryCategory" fkcolumn="categoryID" inversejoincolumn="entryID" lazy="true" cascade="all" singularname="entry" inverse="true"; 

    // validation 
    this.constraints = { 
     "name" = {"required" = true}, 
     "active" = {"required" = true, type="boolean"} 
    }; 
} 

Hier ist der Code, den ich laufen:

<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> 

Hinweis die markierten Abschnitte als „arbeitet mit 1 von 5 mal“ und „funktioniert jedes Mal“. Ich verstehe nicht, was ich falsch mache. Ich habe andere Objekte ähnlich denen, wo sie verknüpfte Tabelle verwenden und ich ähnliche Fehlermeldungen erhalte. Ich habe das SQL-Protokoll überprüft. Der Fehler tritt auf, wenn er zum Einfügen in die Tabelle EntryCategory bereit ist. Irgendwelche Ideen?

+0

Würde 'entry.addCategory (entityLoadByPK ("Kategorie", "297e1bfa36986e69013698c3e54f000d"))' besser funktionieren? – Henry

+0

Nicht genau. Die von mir verwendete Wartungsseite ist so eingerichtet, dass der Benutzer mehrere Kategorien auswählen kann. Also, was ich tun möchte, ist die ID-Werte in ein Array von Entitäten zu konvertieren und dann entry.setCategories (my_category_array) –

+0

Wenn das der Fall ist, verwenden Sie HQL und verwenden Sie wo ID in (?). Das funktioniert sehr gut. Wenn die Entität bereits über ein Array verfügt, verwenden Sie zuerst ArrayClear(). – Henry

Antwort

0

Verwenden Sie HQL und verwenden Sie wo ID in (?). Das funktioniert sehr gut.

Wenn die Entität bereits über ein Array verfügt, verwenden Sie zuerst ArrayClear().

UPDATE:

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

Könnten Sie einen kleinen (Pseudo-) Code hineinwerfen? "Use HQL" ist nicht sehr hilfreich für jemanden, der gerade lernt, ORM zu benutzen. – ale