Newsgroup: it.comp.java
Titolo: Impossibile leggere dopo commit() con JPA

Ciao a tutti,
ho sviluppato un'applicazione CRUD utilizzando come persistence
provider Toplink Essentials, Mi si presenta il seguente problema:
Devo salvare dei dati secondo lo schema master-details, ma non riesco
a leggere quello che salvo se non dopo il riavvio dell'applicazione,
anche se fisicamente sono già presenti sul database prima del riavvio.
In pratica, devo leggere testata/dettagli di una offerta e trasformali
in testata/dettagli di un ordine, salvandoli su db.
Siccome questi dati vengono generati all'interno di un'altra
transazione, ho creato un altro entityManager chiamato entityManager2.
Questo è il codice che sto utilizzando:
org.jdesktop.application.ResourceMap resourceMap =
org.jdesktop.application.Application.getInstance(desktopapplication_db_advanced.DesktopApplication_db_advanced.class).getContext().getResourceMap(OffertaEditor.class);
EntityManager entityManager2 =
javax.persistence.Persistence.createEntityManagerFactory(resourceMap.getString("entityManager.persistenceUnit")).createEntityManager();
try {
	entityManager2.getTransaction().begin();
        int numOrdine = 0;
        Object res = entityManager2.createQuery("SELECT
MAX(o.numOrdine) FROM Ordini o WHERE o.anno
= :anno").setParameter("anno", anno).getSingleResult();
        entityManager2.getTransaction().commit();
        if (res != null) {
            numOrdine = (Integer) res;
        }
        numOrdine++;
        numOrdineField.setText(String.valueOf(numOrdine));
        //crea ordine da offerta
        entityManager2.getTransaction().begin();
        //testata ordine
        int index = masterTable.getSelectedRow();
        offerta.Offerte of =
list.get(masterTable.convertRowIndexToModel(index));
        ordine.Ordini ord = new ordine.Ordini();
 
ord.setCodiceCliente(Integer.parseInt(clienteField.getText()));
        ord.setNumOfferta(of.getNumOfferta());
        ord.setNumOrdine(numOrdine);
        entityManager2.persist(ord);
        //dettagli ordine
        Collection<offerta.Dettofferte> ds = of.getDettofferteList();
        Iterator<offerta.Dettofferte> iter = ds.iterator();
        int rows = detailTable.getRowCount();
        for (int idx = 0; idx < rows; idx++) {
            offerta.Dettofferte dettoff = iter.next();
            ordine.Dettordini dettord = new Dettordini();
            dettord.setCodiceArticolo(dettoff.getCodiceArticolo());
            dettord.setDescrizione(dettoff.getDescrizione());
            dettord.setNumOrdine(numOrdine);
            dettord.setPrezzo(dettoff.getPrezzo());
            dettord.setQuantita(dettoff.getQuantita());
            dettord.setTotale(dettoff.getTotale());
            entityManager2.persist(dettord);
            dettord.setCodiceOrdine(ord);
        }
        entityManager2.getTransaction().commit();
        entityManager2.close();
} catch (RollbackException rex) {
    rex.printStackTrace();
    entityManager2.getTransaction().rollback();
    entityManager2.close();
}
Avreste qualche consiglio? Spero possiate aiutarmi. Grazie mille in
anticipo!

Risolto!
Il problema era nella lettura... bisognava aggiornare le entity con un
ciclo di entityManager.refresh(entity);
-
http://carmelosaffioti.blogspot.com
-