Newsgroup: it.comp.java
Titolo: JPA incomprensibile

Buonasera , 
mi sto scontrando con questo problema:
ho due tabelle 
Vendite e Incassi
ad ogni vendita possono corrispondere più incassi (pagamento dilazionato)
quindi siamo nel caso di una relazione @oneToMany.
 
Come avrete capito non sono molto pratico di questo nuovo sistema per gestire i db
sono abituato al vecchio SQL in cui per cercare i dati splittati in due tabelle utilizzavo il classico LEFT JOIN ma soprattutto una volta inserito un record in una tabella , lanciavo il SELECT last_insert_id e prendevo l'ultima primary key inserita per poterla registrare nell'altra tabella .
 
Qui con JPA non si può fare o meglio da quello che ho capito devo inserire i dati delle entity tramite commit() in questo modo si inserisce e si crea la chiave primaria la cui @strategy è settata a IDENTITY , come posso rintracciare questo id? non vorrei ricorrere a CREATENATIVEQUERY perchè altrimenti non ha senso passare a JPA . Mi date dei consigli su come procedere ?
 
grazie
buona Pasqua

 inserire i dati delle entity tramite commit() in questo modo si
 
Oggetto o = new Oggetto();
o = entitymanager.merge(o);
 
o a questo punto avra' l'id correttamente impostato

 dei consigli su come procedere ?
 
procederei con qualche tutorial su come si salvano le tabelle in 
relazione uno-a-molti. in buona sostanza tu gli incassi li dovrai solo 
aggiungere alla relativa proprietà di Vendite e salvare solo 
quest'ultima, fregandotene di agganciare gli id perché sarà jpa a farlo 
per te (è il suo lavoro).

Grazie della risposta, qualcosa già ho letto ma vorrei capire come procedere
 
@Entity
@Table(name = "vendite", catalog = "agenzia", schema = "")
........
public class Vendite implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID")
    private Integer id;
    .................
    @OneToMany(mappedBy="vendita")
    protected List<Incassi> incassi;  
    ....................
 
@Entity
@Table(name = "incassi", catalog = "agenzia", schema = "")
........
public class Incassi implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID")
    private Integer id;
    .................
    @ManyToOne
    protected Vendite vendita;
    ....................
 
Mi sembra che così si mappano le due tabelle con relazione uno-a-molti 
però il problema è come inseriscco i dati ?
 
EntityTransaction userTransaction = em.getTransaction();
userTransaction.begin();
Vendite recordset = new Vendite();
recordset.setCosto(new BigDecimal (costo.getText()));
...........
recordset.incassi.setImporto(200);
..............        
em.persist(recordset);
userTransaction.commit();
 
mi da errore perchè incassi è privata..
come devo fare devo creare un metodo getIncassi() all'interno di vendite ?
ed inoltre la proprietà deve essere 
protected List<Incassi> incassi;
o 
protected Incassi incassi;
??


 procedere
 
se davvero avessi letto qualcosa ti saresti agilmente disincagliato da 
questa situazione perché la strada è quella più semplice possibile: 
ovvero crei una nuova istanza di Incassi, la aggiungi alla lista incassi 
tramite recordset.getIncassi().add() quindi salvi regolarmente recordset. 
ci sono miliardi di esempi nel web.
 


grazie ancora , probabilmente non sono molto ferrato e soprattutto non riesco a trovare dei tutorial che spiegano questa cosa che serva a me, se hai qualche link scrivimelo...per qunto riguarda iltuo esempio non capisco bene perchè per inserire record non utilizzo add ma setto con il metodo set tutte le proprietà dell'entity e poi faccio persist e poi commit.. scusami  qusta mia ignoranza

 grazie ancora , probabilmente non sono molto ferrato e soprattutto non riesco a trovare dei tutorial che spiegano questa cosa che serva a me, se hai qualche link scrivimelo...per qunto riguarda iltuo esempio non capisco bene perch� per inserire record non utilizzo add ma setto con il metodo set tutte le propriet� dell'entity e poi faccio persist e poi commit.. scusami  qusta mia ignoranza
 
http://docs.oracle.com/javaee/6/tutorial/doc/bnbpz.html
 
 
 
L'applicazione 'order' d'esempio spiegata di seguito dovrebbe fare al
caso tuo.
 
http://docs.oracle.com/javaee/6/tutorial/doc/giqst.html
 
 
M.

 M.
 
L'esempio che mi hai segnalato mi sembra ben fatto ma non fa vedere come inserire i dati.
Comuque sia, leggendo il tutorial e l'esempio di rootkit ho modificato il tutto così
 
@Entity
@Table(name = "vendite", catalog = "agenzia", schema = "")
...................
@OneToMany(mappedBy = "vendite")
    private List<Incassi> incassi;
 
    public List<Incassi> getIncassi(){
        return incassi;
 
    }
...................
 
 
 
 
 
@Entity
@Table(name = "incassi", catalog = "agenzia", schema = "")
.......
 @ManyToOne
    protected Vendite vendite;
 
    public Vendite getVendite(){
        return vendite;
    }
 
 
per l'inserimento ho modificato così
 
EntityTransaction userTransaction = em.getTransaction();
        userTransaction.begin();
        Vendite recordset = new Vendite();
        ........
        em.persist(recordset);
 
        Incassi rec = new Incassi();
 
        recordset.getIncassi().add(rec);
 
        rec.setCosto(new BigDecimal(3));
        rec.setDte(dat.getDate());
        rec.setIncasso(new BigDecimal(1));
 
 
Ma mi da errore 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
proprio sulla riga incriminata
 
recordset.getIncassi().add(rec);
 
datemi una soluzione esplicitamente perchè non riesco proprio.

 datemi una soluzione esplicitamente perchè non riesco proprio.
 
 
 
Stai facendo un add ad una lista nulla. Se non lo fai esplicitamente (ad
esempio nel costruttore dell'entità, ma non credo sia la cosa più
"pulita"), devi inizializzare la proprietà "incassi" dell'entità
recordset con una lista vuota.
 
Questo non accade se l'instanza dell'entità recordset non è nuova ma è
già persistente, quindi JPA pone quella proprietà a vuota (non più
nulla) oppure valorizzata con gli oggetti pescati dal db.
 
M.


Ciao grazie ancora per il supporto. 
Non sò cosa fare perchè anch'io avevo intuito che l'entity recordset (vendite) deve esistere poichè il suo id deve essere scritto anche nella campo incassi.idvendita ma ho provato a settare tutte le proprietà dell'entity vendite e poi fare persist , dopodichè ho settato tutte le proprietà di incassi tranne idvendita ho fatto 
recordset.getVendita().add(recordset2)   //recordset2 è l'entity incassi
e infine 
em.persist(recorset2)
STESSO ERRORE
cioè io non voglio sapere come è elegante o meno, voglio sapere come si gestisce una situazione del genere.
Poichè a detta di rootkit mi risulta che di esempi del genere non ce ne siano nel web: tutti i tutorial parlano delle relazioni ma poi all'atto dell'inserimento non c'è nessun esempio che inserisce i dati in due tabelle dove in una c'è la pkey dell'altra.
Ragazzi vi chiedo di fare un esempio pratico e funzionante .
grazie