IllegalStateException: An attempt to save an entity with reference to some not persisted entity. All newly created entities must be saved in the same transaction. Put all these objects to the CommitContext before commit

Salve a tutti,
ho da poco iniziato ad utilizzare cuba framework.

Ho un problema nel salvataggio dell’oggetto “Amortization” figlio dell’oggetto “Asset”, quando salva un record nuovo mi ritorna l’errore in oggetto, ho guardato in internet e sembra che debba utilizzare gli eventi nel middleware, ma non sono riuscito a farlo funzionare.

Qualcuno riesce ad inviarmi darmi una dritta od un codice di esempio?

Grazie,
Massimo

Ciao, riesci a dare qualche dato in più? Come hai configurato il progetto? Versione cuba? Riesci a creare un piccolo progetto di prova e verificare se funziona? E mandarcelo?

Hai provato a guardare qui…

E occhio alle entità persistenti e non…

Ciao Massimo,

l’errore è parlante: stai cercando di salvare un’entità che ha un riferimento ad un oggetto modificato il quale però non fa parte del contesto di salvataggio (il CommitContext).
Per prima cosa ti consiglierei di controllare le relazioni tra le entità, direi che tra Asset ed Amorization debba essere una Composition (non una Association). Se usi Screen standard generati da Cuba Studio tieni presente che tutto è gestito automaticamente purchè il modello sia corretto. Se invece hai utilizzato codice per manipolare le entità ci sono metodi molto semplici per inserire tutti gli oggetti modificati nel CommitContext e far sì che tutto sia salvato contemporaneamente alla chiusura della transazione.

Ciao,

Andrea

Grazie a entrambi.
Si, avevo capito che il problema è nella commit. Probabilmente quando cerca di salvare l’oggetto Amortization non ha il riferimento dell’oggetto Asset, infatti se salvo prima Asset e poi Amortization funziona.
L’oggetto Amortization è già referenziato all’oggetto Asset tramite COMPOSITION.
Il problema è che non so dove e come devo inserire l’evento sul commit per aggiungere il riferimento Asset prima di salvare Amortization.
In effetti all’interno del codice utilizzo “amortizationDc.getMutableItems()…” per popolare la tabella Amortization nello screen, ma il riferimento all’Asset lo passo.
Stasera provo a fare un mini esempio da caricare. Non riesco però a trovare nessun pulsante per caricare i file, devo attivare qualcosa?
Ciao,
Massimo

Effettivamente non so neanche io come si fa! Prova a inserire almeno il pezzo di codice che dici dove popoli la tabella.

Questo è il codice che popola la tabella:

// Cancella lista corrente
amortizationDc.getMutableItems().clear();

// Ammortamento primo anno
Amortization firstYear = metadata.create(Amortization.class);
firstYear.setAsset(asset);
firstYear.setYear(curYear);
firstYear.setDescription(messageBundle.formatMessage("firstRate"));
firstYear.setRate(asset.getCategory().getFirstYearRate());
firstYear.setAmount(firstYearAmount);
amortizationDc.getMutableItems().add(firstYear);

// Ammortamento anno successivo
for(Byte cont = 1; cont < rateNumber - 1; cont++)
{
    Amortization nextYear = metadata.create(Amortization.class);
    nextYear.setAsset(asset);
    ...
    nextYear.setAmount(nextYearAmount);
    amortizationDc.getMutableItems().add(nextYear);
}

// Ammortamento ultimo anno
Amortization lastYear = metadata.create(Amortization.class);
lastYear.setAsset(asset);
...
lastYear.setAmount(lastYearAmount);
amortizationDc.getMutableItems().add(lastYear);

Ho risolto, dovevo usare
dataContext.create(...
invece di
metadata.create(...

Ciao,
Massimo

2 Mi Piace