- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
session.createEntity() liefert entity mit fsId null
Hallo Community,
ich versuche, mit der access API ein Modul zu erstellen, das ein Excel-Sheet einliest, daraus eine Liste von Objekten instanziiert und dann in einer Schleife diese Objekte in eine Tabelle einer FirstSpirit Datenquelle schreibt.
Mein Problem ist, dass unregelmรครig, etwa nach 4 - 10 Iterationen, die von der Methode session.createEntity() erzeugte Entity keine fsId hat.
Dies fรผhrt dann dazu, dass die Werte in den FormData Feldern nicht gespeichert werden kรถnnen. Hier der vereinfachte Code:
Project project = myProject;
Language lang = project.getMasterLanguage();
ContentStoreRoot contentStore = (ContentStoreRoot) project.getUserService().getStore(Store.Type.CONTENTSTORE, true, false);
Content2 table = contentStore.getContent2ByName("TABLE_NAME");
Session session = table.getSchema().getSession();
List
FirstSpirit 5.1.311.65223
Woran kรถnnte es liegen?
Fรผr einen Tip wรคr ich sehr dankbar!
Danke und Gruร,
Benny Kannengieรer
// re-lounge
- Labels:
-
Developers
- Tags:
- access-api
- entity
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
In dem Code sind einige Schritte รผberflรผssig, das erklรคrt aber nicht das Verhalten. Damit solltest du dich an unseren Technical Support wenden. Gibt es vorher Log-Ausgaben, die auf einen Fehler hindeuten?
Die Schleife mรผsste in der folgenden Form ausreichend sein (wenn ich keinen Syntax-Fehler eingabaut habe):
for (Object myObjectToSave : myObjectListToSave) {
Entity entity = session.createEntity(table.getEntityType().getName());
Dataset dataset = table.getDataset(entity);
FormData formData = dataset.getFormData();
FormField formField1 = formData.get(lang, "field1");
formField.set(myObjecToSave.getField1());
// etc. mit anderen Feldern
dataset.setFormData(formData); // => Exception "The entity is invalid" wenn fsId vorher null war
dataset.save();
}
Kannst du bitte den Fehler mit dieser Version des Codes wiederholen, das sollte weniger Log-Ausgaben produzieren.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Peter,
danke fรผr die schnelle Rรผckmeldung.
Tatsรคchlich ist die Exception nicht mehr aufgetaucht, nach dem ich den Aufruf "session.commit()" nach "session.createEntity()" herausgenommen habe.
(Obwohl dann das entity Object noch keine fsId hat).
Trotzdem muss ich immer noch das "dataset.save()" mit einem "table.lock(entity)/table.unlock(entity)" umschlieรen, da ansonsten manchmal dieser Fehler auftaucht:
ERROR 04.03.2015 09:16:39.285 (de.espirit.firstspirit.impl.access.ScriptContextImpl): entity has changed: de.espirit.or.impl.IdentifierImpl$TemporalIdentifierUC@a54f5a9c{product,FS_ID=6656,FS_VALID_FROM=1425456988056,FS_VALID_TO=1425456993005,FS_RELEASE_TO=0}
FSVersion=5.1.311.65223#3209;JDK=1.6.0_39 32bit Sun Microsystems Inc.;OS=Windows 8 6.2 x86;Date=04.03.2015 09:16:39
Ich sehe, dass die entity erst nach dem Aufruf von "dataset.save()" eine fsId hat - ich nehme an, das heiรt, dass intern die Session committed wird?
Danke und Gruร,
Benny Kannengieรer
// re-lounge
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Ja, das Dataset.save() macht intern das commit.
Die Fehlermeldung wird in deinem Code ausgegeben? Kannst du da einen Trace ausgeben?
Ohne Trace kann man nur Vermutungen รผber die Ursache anstellen.. Es kรถnnte eine Fremdschlรผsselbeziehung zu einem Datensatz ("product") sein, das in einer anderen Session geรคndert wurde.. Diese parallele Bearbeitung wird รผber das "lock/unlock" dann natรผrlich unterbunden.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Stimmt, meine entities halten einen Fremdschlรผssel zu einer anderen Tabelle "products".
Dann war das der Grund..
Das mit dem Trace weiร ich nicht wie man das macht.
Aber seit ich table.lock(entity) benutze, ist der error nicht wieder gekommen, also fรผr mich ist die Sache gelรถst ๐
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo,
wir haben leider beim Importieren von Daten aus einer CSV Datei genau die selbe Fehlermeldung "The entity is invalid".
Wie auch im 1. Post beschrieben tritt der Fehler nach einer zufรคlligen Anzahl von geschriebenen Datensรคtzen auf.
Bei manchen Versuchen werden nur 2 Datensรคtze erzeugt, bei anderen sogar gute 100. (in der CSV sind 450 Datensรคtze vorhanden).
1-2 Durchlรคufe waren auch mal erfolgreich, ein erneuter Durchlauf lieร das Ergebnis aber nicht reproduzieren - fรผr den spรคteren Redakteur ist es eher unzumutbar den Import "x-fach" zu starten bis einer erfolgreich war.
Wir haben versucht das ganze mit dem "table.lock()" zu beheben, allerdings ohne Erfolg.
Im Prinzip sieht unser Code identisch zum Umsetzungsvorschlag aus.
Unsere Komplexitรคt dabei ist das wir zusรคtzlich beim Import Querverweise auf 2 weitere Datenquellen erzeugen und falls nรถtig dort ebenfalls einen Datensatz erzeugen. Letztes funktioniert allerdings problemlos - die Fehlermeldung erscheint immer beim Speichern der "Haupt-Entity".
Da user Code durch den CSV-Import etwas lรคnger geworden ist, habe ich diesen in die angehรคngte Datei ausgelagert.
Die Klasse wird in einem Script innerhalb des SiteArchitects aufgerufen, hier haben wir aber auch keine Probleme.
Grรผรe,
Lars
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Lars,
wir haben genau wie Du auch Datensรคtze in einer anderen Tabelle erzeugt, mit der der aktuelle "Hauptdatensatz" in einer 1:N-Beziehung stand.
Wir haben letztendlich รผberall die "session.commit()" Aufrufe entfernt, da der dataset.save() ja schon ein Commit macht.
Also probier's doch auch mal und entferne die commits aus den Methoden "handleCategoryColumn()" und "handleCountryColumn".
Viele Grรผรe,
Benny Kannengieรer
// re-lounge
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Benny,
das "commit()" bei den Countries und Categories brauchten wir, da es sonst reproduzierbar bei der Anlage der Location mit einem zuvor angelegten Querverweis zu einer "Invalid Entity" gekommen ist.
Aufgefallen ist uns allerdings auch das ohne ein "commit" im SiteArchitect die neuen Datensรคtze nicht gelistet wurden.
Wir haben nun noch ein "dataset.setLock(false)" nach dem "save" hinzugefรผgt, da ansonsten alle neuen Datensรคtze im SiteArchitect im Bearbeitungsmodus blieben und aktuell lรคuft das Script reproduzierbar ohne Fehler durch. Vielleicht hat es daran gelegen haben, aber ob es das wirklich war wird sich wohl erst noch zeigen...
Grรผรe,
Lars

